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的食谱书有很多的情况下这些概念..