2011-02-07 9 views
0

正如標題中提到的,有多少種方法可用?附加一個與anthoer ObjectContext分離的實體對象的最佳做法是什麼?

我只是有這種情況:我從一個ObjectContext獲得一個實體對象,然後從OjbectContext對象中分離實體對象,並返回它。

稍後,如果我對此對象進行了一些更改,並且我想將更改保存回數據庫。我想我應該這樣寫,對吧? (好吧,這對我的作品。)

public Url GetOneUrl() 
{ 
    Url u; 
    using(ServicesEntities ctx = new ServicesEntities()) 
    { 
     u = (from t in ctx.Urls select t).FirstOrDefault<Url>(); 
     ctx.Detach(u); 
    } 
    return u; 
} 

public void SaveToDB(Url url) 
{ 
    using(ServicesEntities ctx = new ServicesEntities()) 
    { 
     var t = ctx.GetObjectByKey(_Url.EntityKey) as Url; 
     ctx.Detach(t); 
     ctx.Attach(url); 
     ctx.ObjectStateManager.ChangeObjectState(url, System.Data.EntityState.Modified); 
     ctx.SaveChanges(); 
    } 
} 

Url url = GetOneUrl(); 
url.UrsString = "http://google.com"; //I just change the content. 
SaveToDB(url); 

OR

public void SaveToDB(Url url) 
{ 
    using(ServicesEntities ctx = new ServicesEntities()) 
    { 
     var t = ctx.GetObjectByKey(_Url.EntityKey) as Url; 
     t = url; //this will make t.UrlString becomes "http://google.com" 
     ctx.ApplyCurrentValues<Url>("Urls", t); 
     ctx.SaveChanges(); 
    } 
} 

這種方式也適用於我。

第一種方式會生成sql語句來更新Url表的所有列,但第二種方法會提供一個sql腳本只更新「UrlString」列。

兩者都必須從數據庫中檢索臨時實體對象,這是上面代碼中的't'。

有沒有其他方法可以達到這個目的?或者你知道的其他更好的方法?或者有關此主題的任何官方解決方案

很多謝謝。

回答

0

我不明白你的第一個例子。你爲什麼首先從ObjectContext獲得實體?這不是必需的,因爲您剛剛創建了上下文的新實例。你可以使用:

public void SaveToDB(Url url) 
{ 
    using(ServicesEntities ctx = new ServicesEntities()) 
    { 
     ctx.Attach(url); 
     ctx.ObjectStateManager.ChangeObjectState(url, System.Data.EntityState.Modified); 
     ctx.SaveChanges(); 
    } 
} 

在第二個例子中,你可以叫:

public void SaveToDB(Url url) 
{  
    using(ServicesEntities ctx = new ServicesEntities())  
    {   
    var t = ctx.GetObjectByKey(_Url.EntityKey) as Url; // Ensures that old values are loaded 
    ctx.ApplyCurrentValues<Url>("Urls", url);   
    ctx.SaveChanges();  
    } 
} 

現在兩種方法之間的差異是顯而易見的。第一種方法(Attach)不需要先查詢數據庫。第二種方法(ApplyCurrentValues)需要首先查詢數據庫以獲取舊值。

您可以使用其他兩種方法。 First只是您以前的方法的延伸。它允許您定義哪些屬性發生了變化。第二種方法是手動同步加載實體。這種方法不使用任何特殊的方法。您只需手動將加載的實體屬性設置爲所需的值。如果您使用對象圖而不是單個實體,則此方法非常有用,因爲EF無法自動同步關係中的更改。

+0

嗨拉迪斯蘭,謝謝你的回覆。但是,你的第一個代碼拋出異常說'像ObjectContext不能有兩個實體對象具有相同的EntityKey'?當我直接將實體附加到一個新的ObjectContext實例時,我總是得到這個異常。 – 2011-02-07 21:56:05

相關問題