如何使用EF4 Code-First一次创建两个关联的实体
问题描述:
所以说我有两个实体,Post
和PostHistory
。每当我创建或编辑帖子时,我都想创建一个精确副本作为PostHistory
以记录对帖子所做的所有更改。说后实体的定义如下:如何使用EF4 Code-First一次创建两个关联的实体
public class Post
{
public int Id { get; set; }
public string Text { get; set; }
public virtual ICollection<PostHistory> PostHistory{ get; set; }
}
当我创建我的第一个Post
的问题就来了。例如,如果我试试这个:
Post post = new Post { Text = "Blah" };
context.Posts.Add(post);
PostHistory history = new PostHistory { Text = "Blah"};
context.PostHistory.Add(history);
post.PostHistory.Add(history);
这将失败,因为因为这两个post
和history
是新的实体,Post.PostHistory
为空,由于它没有尚未初始化。我能看到这样做的唯一方法是首先将post
提交给数据库,然后将history
提交到数据库,但我不明白为什么执行2个单独的插入应该是必要的。
如果我有一个初始化ICollection
到List<T>
一切工作正常,但强制实施List<T>
原因等问题,几乎没有代码优先教程为此*发起一个构造函数。
那么处理这种情况的最佳方法是什么?
答
您可以在客户端代码本身初始化列表:
Post post = new Post
{
Text = "Blah"
PostHistory = new List()
{
new PostHistory { Text = "Blah" }
}
};
context.Posts.Add(post);
context.SaveChanges();
然而,有什么错初始化构造函数中的集合,它实际上是建议,因为它把你从初始化它所有的客户端代码。
将列表初始化为列表可行,但这不是一个好选择。原因是你不能将列表转换为EntityCollection (所以我可以检查集合是否已经被加载)。 –
KallDrexx
2011-02-18 01:22:34