【问题标题】:Entity attachment issues in LINQLINQ 中的实体附件问题
【发布时间】:2009-02-11 11:34:10
【问题描述】:

从表单 POST 收到 LINQ 实体后,我尝试将其附加到数据上下文。但是,我得到的只是以下异常:

An entity can only be attached as modified without original state if it declares a version member or does not have an update check policy.

我也尝试过附加原始行,如下所示:

dataContext.People.Attach(person, originalPerson);

在这种情况下,我得到以下异常:

Object reference not set to an instance of an object.

这是我控制器中的代码:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, Person person) {
    var prevPerson = dataContext.People.Single(p => p.ID == id);
    dataContext.People.Attach(person, prevPerson);
    dataContext.SubmitChanges();
    return Redirect("~/People/Index");
}

关于我在这里做错了什么有什么想法吗?如果需要,我可以发布实体代码。

【问题讨论】:

  • 哪一行/对象引发“对象引用未设置为对象实例”错误?我猜 prevPerson 是空的(也许 ID 没有像你期望的那样被映射?)但是如果没有看到代码就很难说......
  • 正在映射。当我将实体 Attach() 到 Table 对象时,它会引发错误。

标签: c# asp.net-mvc linq-to-sql


【解决方案1】:

尝试以下操作:

dataContext.People.Attach(person);
dataContext.Refresh(RefreshMode.KeepCurrentValues, person);
dataContext.SubmitChanges();

【讨论】:

  • 这是最适合我的解决方案。无需在所有属性上设置UpdateCheck=Never
  • 完美运行,适用于附加实体和未附加实体
  • 这确实有效,但它会在保存之前从数据库中加载对象。我不想要额外的负载,这就是为什么我要附加以前加载的东西。
  • 多年后,但想补充一下,这会导致“尝试附加或添加一个不是新的实体,可能是从另一个 DataContext 加载的。不支持。”
  • 因此,要跟进 Jon Kruger 的“2015 年 9 月 9 日 20:34”评论,有没有办法避免“额外负载”并强制它更新所有列(无需“在所有属性上设置 UpdateCheck (Attribute)=Never”,我认为这需要(在 SQL Metal 中)更改自动生成的代码)?我从中检索实体的 DataContext 已经在更新/删除时被关闭和处置(因为我们在每次 Db 访问时打开、关闭和处置 DataContext)。
【解决方案2】:

在 LinqToSQL 设计器中,将所有更新检查设置为从不,并且在附加时这样调用它:

 context.entity.Attach(entity, true);

或者,您也可以从数据库中获取实体并使用已发布实体中的数据对其进行更改,然后将其作为更改提交。

【讨论】:

  • 我在做类似的事情时遇到了同样的问题。
  • 该调用导致“如果实体声明版本成员或没有更新检查策略,则该实体只能在没有原始状态的情况下附加为已修改。”} System.Exception {System.InvalidOperationException} .” 对我来说。@Roman O 的回答日期为“2012 年 1 月 30 日 12:44”对我有用。注意:我从中检索实体的 DataContext 已经关闭和处置(因为我们打开,关闭并使用每个 Db 访问处理 DataContext)。
【解决方案3】:

我通过在 .Dbml 文件中将UpdateCheck=Never 设置为我的属性和context.entity.Attach(entity, true); 来解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2011-12-27
    • 2011-02-03
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多