Как создать две связанные сущности одновременно с EF4 Code-First - PullRequest
5 голосов
/ 18 февраля 2011

Скажем, у меня есть 2 сущности, Post и PostHistory. Всякий раз, когда я создаю или редактирую сообщение, я хочу создать его точную копию как PostHistory для регистрации всех изменений, внесенных в сообщение. Скажем, сущность сообщения имеет следующее определение:

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> вызывает другие проблемы, и почти никакие учебные пособия по коду не выполняют эту принудительную инициацию.

Так, как лучше всего справиться с этой ситуацией?

1 Ответ

4 голосов
/ 18 февраля 2011

Вы можете инициализировать список в самом коде клиента:

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

Однако, нет ничего плохого в инициализации коллекции внутри конструктора, и это действительно рекомендуется, потому что это избавляет вас от необходимости инициализировать ее во всех клиентских кодах.

...