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

TTT*_*TTT 10 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();
Run Code Online (Sandbox Code Playgroud)

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

Sla*_*uma 21

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

  • 它表示您不希望跟踪现有实体的更改
  • 当第二个版本附加时,它不会将实体附加到上下文中,然后立即将其分离(这很可能性能稍差)
  • 它持久化关系(在这个简单的例子中无关紧要,但一般而言),而分离实体只会分离你传入的实体本身Detach.相关的子项将保持附加,其中包含将清除关系的价格(例如,子实体的导航集合将被清空,参考导航属性将被设置为null),因为EF不允许具有附加组合的对象图形和分离的实体.

  • 出色的答案.谢谢. (2认同)