实体框架:Detach和AsNoTracking之间的区别

时间:2013-11-22 20:31:33

标签: c# entity-framework

我的目标是复制现有实体,稍加修改,然后插入修改后的版本。

我尝试了两种似乎都有效的方法:

var thing = context.Things.Where(x => x.SomeID == someid).AsNoTracking().Single();
thing.AnotherID = 1234;
context.Things.AddObject(thing);
context.SaveChanges();

var thing = context.Things.Where(x => x.SomeID == someid).Single();
context.Detach(thing);
thing.AnotherID = 1234;
context.Things.AddObject(thing);
context.SaveChanges();

据我所知,他们都在实现我的目标。其中一个比另一个好,还是它们都同样好(或错误!?)

1 个答案:

答案 0 :(得分:18)

第一个版本更好,我更喜欢它,因为

  • 它表示您不希望跟踪现有实体的更改
  • 当第二个版本附加时,它不会将实体附加到上下文中,然后立即将其分离(最有可能性能稍差)
  • 它持久化关系(在这个简单的例子中无关紧要,但一般而言),而分离实体只会分离你传递给Detach的实体本身。由于EF不允许对象图混合了附加和分离的实体。