MVC 4 EF5 - 添加子实体错误

时间:2013-04-18 20:00:01

标签: c#-4.0 asp.net-mvc-4 entity-framework-5

在尝试向我的EF上下文添加多个实体级别时,我收到对象引用未设置为对象实例错误。

采用以下三级示例类结构:

public class Forum
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Blog> Blogs { get; set; }
}

public class Blog
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ForumID { get; set; }
    public virtual Forum Forum { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int BlogID { get; set; }
    public virtual Blog Blog { get; set; }
}

对于给定的论坛,我想添加一个带有新帖子的新博客:

Forum MyForum = context.Forums.Find(1);
Blog MyBlog = new Blog { Name = "My New Blog" };
Post MyPost = new Post { Name = "My New Post" };

MyForum.Blogs.Add(MyBlog); // This WORKS

MyBlog.Posts.Add(MyPost);  // This FAILS

context.SaveChanges();     // We never make it this far

我已尝试过所有可能的订单组合,包括在context.SaveChanges()之后立即放置.Add(MyBlog)。它似乎很窒息,因为Blog.ID没有Post.BlogID,但EF会生成临时键值以供在这种情况下使用。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

答案提示(以及根问题)可在以下网址找到:

“简单”解决方案是手动初始化Blog.Posts集合:

Blog MyBlog = new Blog { Name = "My New Post", Posts = new List<Post>() };

或者,您可以按照Ladislav在第二个链接中的建议将此逻辑构建到类构造函数中。

基本上,当您创建新对象时,该集合为空并且未初始化为List&lt;&gt;,因此.Add()调用失败。 Forum.Blogs集合能够延迟加载,因为它派生自数据库上下文。但是,Blog.Posts是从头开始创建的,EF无法帮助您,因此默认情况下该集合为空。