Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架:分离和AsNoTracking之间的区别_C#_Entity Framework - Fatal编程技术网

C# 实体框架:分离和AsNoTracking之间的区别

C# 实体框架:分离和AsNoTracking之间的区别,c#,entity-framework,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 =&g

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

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

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

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

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

  • 最好不要跟踪现有实体的更改
  • 它首先不会将实体附加到上下文,而第二个版本会附加实体,然后立即将其分离(这很可能也会有稍差的性能)
  • 它保持关系(在这个简单的示例中并不重要,但通常情况下),而分离实体只会分离传递到
    Detach
    中的实体本身。由于EF不允许对象图混合附着和分离实体,因此相关子对象将保持附着状态,这与清除关系的价格有关(例如,子实体的导航集合将被清空,参考导航属性将设置为
    null

仅供参考,因为您使用了
FirstOrDefault
thing
可能是
null
。在尝试使用@JohnSaunders-thx之前,您需要检查
null
。我把它改成了单曲,答案很好。谢谢。如果你只有一件,性能只会稍差一点。但是如果你有几千个,那么这就是3秒手术和15分钟手术的区别。是的,这些都是真实的数字;-)