处理非跟踪自跟踪实体的正确方法是什么?

时间:2010-03-22 20:17:59

标签: entity-framework .net-4.0 entity-framework-4 self-tracking-entities

自我跟踪实体。真棒。

除非您执行类似

的操作
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 个答案:

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