0

在使用 Entity Framework 5 进行更新/创建时,我无法正确保存我的关系。

我有一个带有 EF 5 的新 MVC 4.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 回答