我正在使用Entity Framework和AS.NET MVC应用程序。我需要允许用户创建新记录并修改现有记录。我能够获取现有记录没有问题,但是当我传回已编辑的实体并尝试保存它时,它会创建一个新的并保存它并保留原始未修改的记录。
我使用主键从EF获取对象(例如员工记录的ID号)。我成功检索它,并像这样设置MergeOption:
Context.Sector.MergeOption = MergeOption.NoTracking;
我能够跟踪对象是否有正确的数据(使用原始记录的密钥)一直到我打电话的地方:
Context.SaveChanges();
然而,在此之后,创建新记录而不是修改现有记录。
我有什么明显的遗失吗?我本以为检索对象并更改它的一些值(而不是ID)并保存它只会起作用,但显然不行。
谢谢,
克里斯
答案 0 :(得分:3)
“NoTracking意味着绕过了ObjectStateManager,因此对实体对象的每次访问都会导致从数据库中获取并创建新对象。”
- http://blog.dynatrace.com/2009/03/11/adonet-entity-framework-unexpected-behaviour-with-mergeoptions/
我认为NoTracking不是你想要的。
答案 1 :(得分:0)
从您的评论:“分布在各个层和一些专有库”
你是新手()是否正在使用ObjectContext,关闭它或丢失对它的引用,然后尝试将对象保存到new()或不同的ObjectContext?
如果是这样,您将丢失所有更改跟踪信息。如果是这种情况,那么你想调用Attach()方法将实体重新附加到上下文,ApplyPropertyChanges()然后最后SaveChanges()。
Julie Lerman有一篇非常好的博客文章,概述了所有可用的不同变更跟踪选项和技术。您还应该查看同一主题的this MSDN article。