1

MVC3、Entity Frameworkプロジェクトでは、編集ビューでViewModelを使用しています(オブジェクトをマップするためにAutoMapperを使用しています)。

(編集ビューで)呼び出すとdb.SaveChanges();エラーが発生しますが、

関係の外部キープロパティを公開していないエンティティの保存中にエラーが発生しました。単一のエンティティを例外のソースとして識別できないため、EntityEntriesプロパティはnullを返します。保存中の例外の処理は、エンティティタイプの外部キープロパティを公開することで簡単にできます。詳細については、InnerExceptionを参照してください

内部例外は、

ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。エンティティがロードされてから、エンティティが変更または削除された可能性があります。ObjectStateManagerエントリを更新します。

私はこのエラーメッセージについてWebを検索しましたが、これは楽観的同時実行性の問題であり、 Postモデルで定義された1対多の関係が原因であると思います。

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の質問から学んだ

于 2012-07-10T09:30:11.207 に答える