【问题标题】:Error while updating Database record with Entity Framework on ASP.NET MVC Page在 ASP.NET MVC 页面上使用实体框架更新数据库记录时出错
【发布时间】:2010-03-12 19:43:29
【问题描述】:

我有一个 ASP.NET 页面,用于更新选定记录的注册用户地址详细信息。

下面是我从控制器调用的更新方法。

当我调用ApplyPropertyChanges 方法时,我收到一个错误。是否有人在使用 Entity Framework 更新记录时遇到了同样的错误?

感谢您的回复。

错误信息:

ObjectContext 中的现有对象处于已添加状态。只有在现有对象处于未更改或修改状态时才能应用更改。

我的Update 方法:

[HttpPost]
public bool UpdateAddressDetail([Bind(Prefix = "RegUser")] AddressDetail regUserAddress, FormCollection formData)
{
    regUserAddress.AD_Id = 3;
    regUserAddress.LastUpdated = HttpContext.User.Identity.Name;
    regUserAddress.UpdatedOn = DateTime.Now;
    regUserAddress.AddressType = ((AddressDetail)Session["CurrentAddress"]).AddressType ?? "Primary";
    regUserAddress.Phone = ((AddressDetail)Session["CurrentAddress"]).Phone;
    regUserAddress.Country = ((AddressDetail)Session["CurrentAddress"]).AddressType ?? "USA";

    miEntity.ApplyPropertyChanges(regUserAddress.EntityKey.EntitySetName, regUserAddress);

    miEntity.SaveChanges();

    return true;
}

【问题讨论】:

  • 我在这里以稍微不同的方式解释了同样的问题:stackoverflow.com/questions/2443062/… 主要原因是有一个 TypeConverter 最终将 State(这是一个实体/查找表)添加到地址,并且that 将 Address 对象从 Detached 状态移动到 added 状态。现在不可能 ApplyPropertyChanges 或附加错误添加的地址。如果不是使用 TypeConverter,而是在控制器本身中分配 EntityReference,它就可以正常工作。所以 - 是否可以避免添加对象?

标签: asp.net asp.net-mvc entity-framework


【解决方案1】:

错误是对象已从上下文中分离,并且 ApplyPropertyChanges 认为该对象已添加,因为它没有附加。因此,您需要从数据上下文中查询或获取附加表单,然后应用更改。

HTH。

【讨论】:

    【解决方案2】:

    戴夫说了什么

    +

    您需要将断开连接的实体 Attach() 到您的对象上下文:

    http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.attach.aspx

    miEntity.Attach(regUserAddress);
    miEntity.SaveChanges();
    

    【讨论】:

    • 您确定记录在数据库中吗? AD_id 是什么? PK?
    • 是的。数据库中有这条记录。
    【解决方案3】:

    只需在miEntity.SaveChanges()之前添加以下代码:

    miEntity.Entry(regUserAddress).State = EntityState.Modified;
    

    【讨论】:

      【解决方案4】:

      首先选择记录(对象实体),通过ObjectContext键搜索。例如,如果搜索 ArticleSet EntitySet 调用那里进行记录,一旦你得到它用新值修改它的属性,然后调用ObjectContextSaveChanges()

      例子:

      ObjectQuery<Article> myArt=Context.ArticleSet.Where myArt = (row => row.ArticleId == value);
      myArt.Description=" new value ";
      etc. ..
      etc ...
      
      Context.SaveChanges ();
      

      【讨论】:

        猜你喜欢
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多