在尝试向我的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会生成临时键值以供在这种情况下使用。
有什么想法吗?
答案 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无法帮助您,因此默认情况下该集合为空。