5

Alors Disons que j'ai 2 entités, Post et PostHistory. Chaque fois que je crée ou édite un article, je veux en créer une copie exacte sous la forme PostHistory pour enregistrer toutes les modifications apportées à un article. Dire l'entité post a la définition suivante:Comment puis-je créer deux entités associées à la fois avec EF4 Code-First

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

Le problème vient quand je crée mon premier Post. Par exemple, si j'essaie ceci:

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

Cela échouera car puisque les deux post et history sont de nouvelles entités, Post.PostHistory est nulle en raison de ce ne pas avoir encore été initialisé. La seule façon que je peux voir pour faire ceci est d'abord commettre post à la base de données, puis commettre history à la base de données, mais je ne vois pas pourquoi effectuer 2 insertions séparées devrait être nécessaire pour cela.

Si j'ai un constructeur qui initialise le ICollection à tout List<T> fonctionne très bien, mais forçant la mise en œuvre à List<T> cause d'autres problèmes, et presque pas de tutoriels premier code ne cette initiation forcée.

Alors, quelle est la meilleure façon de gérer cette situation?

Répondre

4

Vous pouvez initialiser la liste dans le code client lui-même:

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

Cependant, il n'y a rien de mal à initialiser la collection à l'intérieur du constructeur et il est effectivement recommandé, car il vous évite d'avoir à initialiser dans tous les codes clients.

+0

L'initialisation de la collection sous forme de liste fonctionne mais ce n'est pas une bonne option. La raison en est que vous ne pouvez pas convertir une liste en un EntityCollection (donc je peux vérifier si la collection a été chargée avec impatience par exemple). – KallDrexx

+0

Comment vérifier si la collection est impatiemment chargée avec 'EntityCollection'? –

+0

La classe 'EntityCollection ' a une propriété 'IsLoaded' – KallDrexx

Questions connexes