如何使用EF4 Code-First一次创建两个关联实体

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)

这将失败,因为因为这两个posthistory是新的实体,Post.PostHistory因为它没有尚未初始化为空.我能看到这样做的唯一方法是首先提交postdb,然后提交history到数据库,但我不明白为什么要为此执行2个单独的插入.

如果我有一个构造函数初始化ICollectionList<T>一切正常,但强制实现List<T>导致其他问题,几乎没有代码优先教程这样做强制启动.

那么处理这种情况的最佳方法是什么?

Mor*_*avi 4

您可以在客户端代码本身中初始化列表:

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)

但是,在构造函数内初始化集合没有任何问题,实际上建议这样做,因为它使您不必在所有客户端代码中初始化它。