0

我有三个 EntityFramework (4.3) 对象,一个成员、地址和一个状态。它们看起来像这样:

public class Member
{
    public int Id { get; set; }
    public virtual Address Address { get; set; }
    /*other properties removed for brevity*/
}

public class Address
{
    public int Id { get; set; }
    public virtual State State { get; set; }
    /*other properties removed for brevity*/
}

public class State
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Abbreviation { get; set; }
    public virtual ICollection<Address> Address { get; set; }
}

当我更新地址关系时,一切正常。请参见下面的代码:

[HttpPost]
public ActionResult Update(MemberUpdateModel model)
{
    if (!ModelState.IsValid)
    {
        model.SetStateSelectList(_db, model.SelectedStateId);
        return View(model);
    }

    _db.Entry(model.Member).State = EntityState.Modified;
    _db.Entry(model.Member.Address).State = EntityState.Modified;

    _db.SaveChanges(); // works

    return RedirectToAction("Index");
}

然后我添加了地址/状态关系的更新,如下所示:

[HttpPost]
public ActionResult Update(MemberUpdateModel model)
{
    if (!ModelState.IsValid)
    {
        model.SetStateSelectList(_db, model.SelectedStateId);
        return View(model);
    }

    _db.Entry(model.Member).State = EntityState.Modified;
    _db.Entry(model.Member.Address).State = EntityState.Modified;

    // added for address/state relationship
    var selectedState = _db.States.FirstOrDefault(q => q.Id == model.SelectedStateId);
    model.Member.Address.State = selectedState;

    _db.SaveChanges();

    return RedirectToAction("Index");
}

当我们运行上面的代码时,我们得到以下错误:

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.OptimisticConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

我做错了什么导致这种行为?

4

2 回答 2

0

“OptimisticConcurrencyException”在这里看起来是一个有意义的线索。这个讨论可能有用。

于 2012-08-16T19:21:53.440 回答
0

我们将更新操作更改为首先查询现有数据,然后使用发布的数据更新对象。

[HttpPost]
public ActionResult Update(MemberUpdateModel model)
{
    if (!ModelState.IsValid)
    {
        model.SetStateSelectList(_db, model.SelectedStateId);
        return View(model);
    }

    var newModel = new MemberUpdateModel();
    newModel.Member = _db.Members.Include("Address").FirstOrDefault(q => q.Id == model.Member.Id);
    newModel.Member.Address.State = _db.States.FirstOrDefault(q => q.Id == model.SelectedStateId);

    bool success = TryUpdateModel(newModel);
    if (success)
    {
        _db.SaveChanges();
    }
    else
    {
        throw new Exception("TryUpdateModel() Failed");
    }

    return RedirectToAction("Index");
}

这很好用。

于 2012-08-16T20:10:20.337 回答