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. 根据需要更新属性

确切地说,我应该对不跟踪自己的自我跟踪实体做什么?


小更新:

盲目地将实体标记为修改后的作品,但这似乎有点臭。在这种情况下我们能做到最好吗?

4

1 回答 1

6

情景 1

以下是一些建议遵循的做法。当您在 WCF 场景中使用 STE 时,您应该依赖 STE 在服务器端实现的更改跟踪器,因此您可以执行以下操作。

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

方案 2 但是,如果您在服务器上,建议的做法是在名为 EnableChangeTracking 的 objectcontext 的分部类上创建一个方法。该方法将查询处于未更改状态的实体,这些实体实现了 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 如果用户实体是从不同的上下文中检索的,那么你将使用它来保存上下文,那么这里是你检索原始实体的另一个选项。

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 食谱书中广泛地介绍了这些概念,其中包含很多场景。

于 2010-07-09T06:37:12.677 回答