自我跟踪实体。真棒。
除非您执行类似
的操作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
除了
之外,我无法想象其他任何东西我应该如何处理不跟踪自己的自我跟踪实体?
小更新:
盲目地将实体标记为已修改的作品,但这看起来有点臭。在这种情况下,这是我们能做的最好的吗?
答案 0 :(得分:6)
方案1
以下是一些建议的做法。 当您在WCF场景中使用STE时,您应该依赖STE实现的更改跟踪器,以便在服务器端执行以下操作。
db.Users.ApplyChanges(user);
db.SaveChanges();
方案2 但是,如果您在服务器上,建议的做法是在objectcontext的partial类上创建一个名为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 如果从不同的上下文中检索用户实体,那么上下文u将使用它来保存,那么这里是另一个选项,其中你将实体标记为已修改,而不关心修改了什么。
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
我在我的Entity Framework 4.0食谱书中广泛地介绍了这些概念,包括很多场景..