实体框架创建新记录而不是修改现有记录

时间:2010-02-01 23:50:57

标签: asp.net-mvc entity-framework

我正在使用Entity Framework和AS.NET MVC应用程序。我需要允许用户创建新记录并修改现有记录。我能够获取现有记录没有问题,但是当我传回已编辑的实体并尝试保存它时,它会创建一个新的并保存它并保留原始未修改的记录。

我使用主键从EF获取对象(例如员工记录的ID号)。我成功检索它,并像这样设置MergeOption:

Context.Sector.MergeOption = MergeOption.NoTracking;

我能够跟踪对象是否有正确的数据(使用原始记录的密钥)一直到我打电话的地方:

Context.SaveChanges();

然而,在此之后,创建新记录而不是修改现有记录。

我有什么明显的遗失吗?我本以为检索对象并更改它的一些值(而不是ID)并保存它只会起作用,但显然不行。

谢谢,

克里斯

2 个答案:

答案 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