Kal*_*exx 5 c# entity-relationship entity-framework code-first entity-framework-4
所以说我有2个实体,Post
并且PostHistory
.每当我创建或编辑帖子时,我都想创建一个精确的副本,PostHistory
以记录对帖子所做的所有更改.假设post实体具有以下定义:
public class Post
{
public int Id { get; set; }
public string Text { get; set; }
public virtual ICollection<PostHistory> PostHistory{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我创建第一个问题时,问题就来了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);
Run Code Online (Sandbox Code Playgroud)
这将失败,因为因为这两个post
和history
是新的实体,Post.PostHistory
因为它没有尚未初始化为空.我能看到这样做的唯一方法是首先提交post
db,然后提交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();
Run Code Online (Sandbox Code Playgroud)
但是,在构造函数内初始化集合没有任何问题,实际上建议这样做,因为它使您不必在所有客户端代码中初始化它。