0

尝试将多个实体级别添加到我的 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用于 for Post.BlogID,但 EF 生成临时键值以供在这种情况下使用。

有任何想法吗?

4

1 回答 1

0

可以在以下位置找到答案(和根本问题)的提示:

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

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

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

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

于 2013-04-18T21:14:53.230 回答