正如標題中提到的,有多少種方法可用?附加一個與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'。
有沒有其他方法可以達到這個目的?或者你知道的其他更好的方法?或者有關此主題的任何官方解決方案
很多謝謝。
嗨拉迪斯蘭,謝謝你的回覆。但是,你的第一個代碼拋出異常說'像ObjectContext不能有兩個實體對象具有相同的EntityKey'?當我直接將實體附加到一個新的ObjectContext實例時,我總是得到這個異常。 – 2011-02-07 21:56:05