5

所以说我有两个实体,PostPostHistory。每当我创建或编辑帖子时,我都想创建一个精确副本作为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); 

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

如果我有一个初始化ICollectionList<T>一切工作正常,但强制实施List<T>原因等问题,几乎没有代码优先教程为此被迫发起一个构造函数。

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

回答

4

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

Post post = new Post 
{ 
    Text = "Blah" 
    PostHistory = new List() 
    { 
     new PostHistory { Text = "Blah" } 
    } 
};   
context.Posts.Add(post); 
context.SaveChanges(); 

然而,有什么错初始化构造函数中的集合,它实际上是建议,因为它把你从初始化它所有的客户端代码。

+0

将列表初始化为列表可行,但这不是一个好选择。原因是你不能将列表转换为EntityCollection (所以我可以检查集合是否已经被加载)。 – KallDrexx 2011-02-18 01:22:34

相关问题