【问题标题】:Entity Framework creating new record instead of modifying existing one实体框架创建新记录而不是修改现有记录
【发布时间】:2023-04-01 18:25:01
【问题描述】:

我正在使用带有 AS.NET MVC 应用程序的实体框架。我需要允许用户创建新记录并修改现有记录。我可以毫无问题地获取现有记录,但是当我传回编辑过的实体并尝试保存它时,它会创建一个新记录并保存它,而原始记录保持不变。

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

Context.Sector.MergeOption = MergeOption.NoTracking;

我能够一直追踪到该对象具有正确的数据(使用原始记录的键)直到我调用的点:

Context.SaveChanges();

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

我在这里有什么明显的遗漏吗?我原以为检索对象并更改其某些值(不是 ID)并保存它会起作用,但显然不行。

谢谢,

克里斯

【问题讨论】:

  • 发布你的代码,我想我知道你做错了什么但不能确定。
  • 您有什么特别需要看的吗?我想发布更多代码,但它分布在各个层和一些专有库中,所以如果有什么特别有助于我的东西,我可以删除它。你的理论是什么?

标签: asp.net-mvc entity-framework


【解决方案1】:

“NoTracking 意味着绕过了 ObjectStateManager,因此每次访问实体对象都会导致从数据库中获取数据并创建新对象。”

-- http://blog.dynatrace.com/2009/03/11/adonet-entity-framework-unexpected-behaviour-with-mergeoptions/

我不认为 N​​oTracking 是你想要的。

【讨论】:

  • 我真的很想知道他为什么会去设置合并选项为 NoTracking。他没有解释原因。这听起来非常合理,这是他犯错的地方。如果对象服务不再能够跟踪实体上的更改,则该实体将被假定为新实体。
【解决方案2】:

根据您的评论:“分布在各个层级和一些专有库中”

您是在新建一个 ObjectContext、关闭它还是丢失对它的引用,然后尝试将您的对象保存到一个 new() 或不同的 ObjectContext?

如果是这样,您将丢失所有更改跟踪信息。如果是这种情况,那么您需要调用 Attach() 方法将实体重新附加到上下文、ApplyPropertyChanges(),然后最后调用 SaveChanges()。

Julie Lerman 有一篇很好的博文,概述了所有不同的变更跟踪选项和可用的技术。您还应该在同一主题上查看 this MSDN article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 2021-12-11
    • 2012-07-25
    • 2021-03-30
    • 2011-12-10
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多