在MVC中更新时的乐观并发问题

时间:2012-07-10 03:52:22

标签: c# asp.net-mvc-3 entity-framework-4.1 automapper

在MVC3,Entity Framework项目中,我在编辑视图中使用ViewModel(和AutoMapper来映射对象)。

调用db.SaveChanges();(在编辑视图中)时会出错,

  

保存不公开外键的实体时发生错误   他们关系的属性。 EntityEntries属性将   返回null,因为无法将单个实体标识为源   例外。可以在保存时处理异常   通过在实体类型中公开外键属性更容易。看到   详细信息的InnerException

内部异常是,

  

存储更新,插入或删除语句会影响意外   行数(0)。自那以后,实体可能已被修改或删除   实体已加载。刷新ObjectStateManager条目。

我在网上搜索了此错误消息,现在我猜这是乐观并发问题,由 Post 模型中定义的一对多关系引发,

  

Post.Postedby - >用户

     

Post.Author - >作者

(这可能是由于,我试图更新的Post模型是分离的,并且在调用SaveChanges时没有现有值)

模型

public class Post
{
    [Key]
    public int Id { get; set; }
    ...
    public virtual User PostedBy { get; set; }
    public virtual Author Author { get; set; }
}

public class User
{
    [Key]
    public virtual Guid UserId { get; set; }
    ...
    public virtual ICollection<Post> Posts { get; set; }
}

public class Author
{
    public int Id { get; set; }
    ...
    public virtual ICollection<Post> Posts { get; set; }
}

控制器

[HttpPost]
public ActionResult Edit(PostEditViewModel postEditViewModel, FormCollection form)
{
    if (ModelState.IsValid)
    {
        var post = Mapper.Map<PostEditViewModel, Post>(postEditViewModel);
        db.Entry(post).State = EntityState.Modified;
        string authorId = form["AuthorId"];
        post.Author = GetAuthorById(Convert.ToInt32(authorId));
        post.PostedBy = GetUserByName(User.Identity.Name);
        db.SaveChanges();
        return RedirectToAction("Index");
     }
        return View(postEditViewModel);
 }

请帮我解决这个问题...

1 个答案:

答案 0 :(得分:1)

在编辑视图中添加此项修复了问题:)

@Html.HiddenFor(model => model.Id)

this SO question

了解到