【问题标题】:Entity Framework: difference between Detach and AsNoTracking实体框架:分离和 AsNoTracking 之间的区别
【发布时间】:2013-11-23 22:18:12
【问题描述】:

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

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

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();

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

【问题讨论】:

  • 仅供参考,因为您使用了FirstOrDefault,所以thing 可能是null。在尝试使用 thing 之前,您需要检查 null
  • @JohnSaunders - 谢谢。我将其编辑为使用 Single。

标签: c# entity-framework


【解决方案1】:

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

  • 更好地表达了您不想跟踪现有实体的更改
  • 它首先不将实体附加到上下文,而第二个版本附加然后立即分离它(很可能性能也会稍差)
  • 它保留关系(在这个简单的示例中无关紧要,但通常情况下),而分离实体只会分离您传递到Detach 的实体本身。由于 EF 不允许对象图带有附加实体和分离实体的混合。

【讨论】:

  • 出色的答案。谢谢。
  • 如果您只有 1 项,则性能只会稍差。但是,如果您有数千个,那么这就是 3 秒操作与 15 分钟操作之间的区别。是的,这些都是真实的数字 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多