5

Así que decir Tengo 2 entidades, Post y PostHistory. Cada vez que creo o edito una publicación, quiero crear una copia exacta de ella como PostHistory para registrar todos los cambios realizados en una publicación. Decir que la entidad resultante tiene la siguiente definición:¿Cómo puedo crear dos entidades asociadas a la vez con EF4 Code-First

public class Post 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
    public virtual ICollection<PostHistory> PostHistory{ get; set; } 
} 

El problema viene cuando creo mi primer Post. Por ejemplo, si intento esto:

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

que pueden fallar debido ya que ambos post y history son nuevas entidades, Post.PostHistory es nula debido a que no habiendo sido aún inicializado. La única forma que puedo ver para hacer esto es primero comprometer post a la base de datos, luego confirmar history a la base de datos, pero no veo por qué realizar 2 insertos por separado debería ser necesario para esto.

Si tengo un constructor que inicializa el ICollection a un List<T> todo funciona bien, pero obligando a la aplicación a List<T> causas distintas cuestiones, y casi no hay tutoriales de código primero hacer esto iniciación forzada.

Entonces, ¿cuál es la mejor manera de manejar esta situación?

Respuesta

4

Puede inicializar la lista en el código de cliente en sí:

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

Sin embargo, no hay nada malo con la inicialización de la colección dentro del constructor y en realidad es recomendable, ya que le evita tener que inicializarlo en todos los códigos del cliente

+0

Inicializar la colección como una lista funciona, pero no es una buena opción. La razón es que no se puede convertir una Lista en una EntityCollection (por lo que puedo verificar si la colección ha sido cargada con entusiasmo, por ejemplo). – KallDrexx

+0

¿Cómo se comprueba si la colección está ansiosamente cargada con 'EntityCollection'? –

+0

La clase 'EntityCollection ' tiene una propiedad 'IsLoaded' – KallDrexx

Cuestiones relacionadas