1

在 MVC3,实体框架项目中,我在编辑视图中使用 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);
 }

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

4

1 回答 1

1

在编辑视图中添加这个解决了这个问题:)

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

这个 SO question中学到的

于 2012-07-10T09:30:11.207 回答