4

自我跟蹤實體。真棒。處理非跟蹤自我跟蹤實體的正確方法是什麼?

,當你做這樣的事情

return Db.Users; 

沒有自跟蹤實體正在跟蹤(至可能的話,他們是反序列化)除。

好。所以我們必須認識到,返回給我們的實體可能沒有啓用跟蹤。

現在呢?

事情我已經試過

對於給定的方法體:

using (var db = new Database()) 
{ 
    if (update.ChangeTracker.ChangeTrackingEnabled) 
     db.Configurations.ApplyChanges(update); 
    else 
     FigureItOut(update, db); 

    db.SaveChanges(); 
    update.AcceptChanges(); 
} 

FigureItOut所有下面的實現失敗:

db.Configurations.Attach(update); 
db.DetectChanges(); 

db.Configurations.Attach(update); 
db.Configurations.ApplyCurrentValues(update); 

db.Configurations.Attach(update); 
db.Configurations.ApplyOriginalValues(update); 

db.Configurations.Attach(update); 
db.Configurations.ApplyChanges(update 

也約比

  1. 別的我可以計算扔它,其他的從數據庫
  2. 比較獲取原始實體每手財產
  3. 個更新屬性需要

究竟什麼我應該與不追蹤自己自跟蹤實體辦??


小更新:

盲目標誌着實體修改的作品,然而,這似乎有點臭。在這種情況下,我們能做到最好嗎?

+0

唉,看來我有,再一次,走在哪裏,至少不是很多,之前已經走了。 – Will

回答

6

場景1

以下是一些建議的做法。 當您在WCF場景中使用STE時,您應該依靠STE在服務器端執行的更改跟蹤器,以便執行以下操作。

db.Users.ApplyChanges(user); 
db.SaveChanges(); 

場景2 然而,如果你的服務器上,推薦的做法是創建對ObjectContext的局部類稱爲EnableChangeTracking的方法。該方法將查詢是在實現IObjectWithChangeTracker並打開變更跟蹤等等這樣的事情

user = db.users.first(u => u.userid == 1); 
db.EnableChangeTracking(); 

現在試圖從它最初從

檢索不同的上下文中保存的用戶實體不變的狀態實體
db2.users.ApplyChanges(user); 
db2.SaveChanges(); 

場景3 如果在服務器側已連接到從中從檢索到的用戶實體相同的對象的上下文,然後使用STE簡單POCO對象像下面

user = db.users.first(u => u.userid == 1); 
user.LastName = "XYZ"; 
db.DetectChanges(); //no need for it cuz Savechanges implicitly calls this. 
db.SaveChanges(); 

場景4 如果用戶實體是從不同的上下文中檢索的,那麼上下文將使用它來保存,那麼這裏是另一個選項,其中將實體標記爲已修改並且不關心被修改的內容。

user = db.users.first(u => u.userid == 1); 
var db2 = new ObjectContext(); 
user.LastName = "XYZ"; 
db2.Users.Attach(user); 
// i prefer this option.. 
db2.ObjectStateManager.ChangeObjectState(user,EntityState.Modified); 
db2.SaveChanges(); // updates all columns 

方案5 如果用戶實體在不同的上下文檢索那麼上下文ü將用它來保存那麼這裏是另一種選擇,其中u找回原來的實體。

user = db.users.first(u => u.userid == 1); 
user.lastName ="XYZ"; 
var db2 = new ObjectContext(); 
db2.Users.First(u => u.userid == user.userid); 
db2.users.ApplyCurrentValues(user); 
db2.SaveChanges(); 

這裏是一篇博客文章,介紹幾種情況。 http://weblogs.asp.net/zeeshanhirani/archive/2010/03/30/modifying-self-tracking-entity-on-the-server.aspx

我廣泛地覆蓋在我的實體框架4.0的食譜書有很多的情況下這些概念..