0

EntityFramework5を使用した更新/作成時に関係を正しく保存できません。

EF5を使用した新しいMVC4.0プロジェクトがあり、コードファーストの移行を使用しています。

私のモデルはこんな感じです。

public class Blog
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Post
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Text{ get; set; }
    public virtual Blog Blog { get; set; }
}

移行すると、投稿テーブルにBlog_Id列が正しく作成されます。

ポストコントローラー:

var db = new AppContext();
ViewBag.Blogs = new SelectList(db.Blogs.ToList(), "ID", "Title", post.Blog_Id);

投稿ビュー:

<p>
    @Html.LabelFor(model => model.Blog.Id, "Blog")
    @Html.DropDownListFor(model => model.Blog.Id,
         (SelectList)ViewBag.Blogs, "Select blog", new { })
    @Html.ValidationMessageFor(model => model.Blog.Id)
</p>

投稿を作成/更新すると、モデルは保存する前に正しい関係になりますが、Blog_Id列がデータベースに保持されません。

私のアップデート機能はこんな感じ。

var db = new AppContext();
db.Posts.Attach(post);
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();

どんな助けでも大歓迎です。私が見たすべてのドキュメントと例は古く(主にEF4を使用)、MSDNドキュメントは自己参照的(EFはドキュメントを見ると言う、ドキュメントはEFサイトを見ると言う)でナビゲートするのが難しいようです。

4

1 に答える 1

1

最も簡単な解決策は、モデルのプロパティとして外部キーを公開することです。

public class Post
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Text{ get; set; }

    public int BlogId { get; set; } // FK property
    public virtual Blog Blog { get; set; }
}

次に、投稿ビューをそのプロパティにバインドします。

<p>
    @Html.LabelFor(model => model.BlogId, "Blog")
    @Html.DropDownListFor(model => model.BlogId,
        (SelectList)ViewBag.Blogs, "Select blog", new { })
    @Html.ValidationMessageFor(model => model.BlogId)
</p>

関係が変更されたことをEFに認識させるために、変更の追跡が必要にならないようにする場合は、次のようにします。

var db = new AppContext();
var blog = post.Blog;
post.Blog = null;

db.Posts.Attach(post);
db.Entry(post).State = EntityState.Modified;
post.Blog = blog; // EF now recognizes a change of the relationship

db.SaveChanges();
于 2012-11-08T17:18:52.277 に答える