2013-10-15 2 views
2

Je suis un peu confus avec Circular Dependices avec EF car il semble que tout devienne une dépendance circulaire.Entity Framework Code Premières dépendances circulaires

Regarder this tutorial

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

Quand je lance la « carte de code » dans Vs2012 Je ne vois en effet qu'il est une référence circulaire

enter image description here

devrais-je pas être inquiet à ce sujet ? J'essayais d'utiliser Autofixture pour générer des données fictives, mais il se bloque à cause des références circulaires.

Répondre

2

Je suppose que cela dépend de qui vous demandez si vous devez vous inquiéter ou non des associations bidirectionnelles ou non. Dans la conception axée sur le domaine, les gens disent généralement que vous devriez vous inquiéter à ce sujet. E.g. Eric Evans dit dans son livre Domain driven design: tackling the complexity in the heart of software vous devriez les éviter si possible.

Julie Lerman écrit sur la question dans un récent here

Dans l'exemple simple, vous fourni le cadre de l'entité ne devrait pas avoir une se plaint si vous avez supprimé le blog et les propriétés blogid sur Post, mais il peut y avoir d'autres plus complexes cas. Par défaut, l'entité ajoutera une clé étrangère dans les lignes Posts de la base de données à la ligne Blogs propriétaire, mais le modèle de domaine ne pourra être navigué que de Blogs à Posts. L'extrait suivant va d'abord charger le premier blog de la base de données, puis charger paresseux les messages de ce blog.

using (var db = new BlogContext()) 
{ 
    var blog = db.Blogs.FirstOrDefault(); 

    //lazy loading the Posts of the blog that was fetched in previous line   
    foreach (var post in blog.Posts) 
    { 
     Trace.TraceInformation(string.Format("Title of post {0} is {1}", post.Id, post.Title)); 
     } 
    } 
} 

Si vous avez vraiment besoin de naviguer à la fois de Blog à Postes et de messages aux blogs, en raison d'une exigence d'affaires dans votre application, vous devrez choisir entre l'interrogation et une association bidirectionnelle. Le choix dépend entièrement de vous, Entity Framework prend en charge les deux.

Une association bidirectionnelle est lorsque vous avez une propriété de navigation des deux côtés, vous permettant de naviguer dans les deux directions. C'est à dire. Si Blog a une propriété Posts et que chaque publication a une propriété Blog qui pointe vers le Blog, nous avons une association bidirectionnelle.

Une autre option consiste à avoir une propriété de navigation d'un seul côté. Par exemple. un blog peut contenir une liste de messages, ce qui rendrait facile la navigation de blog à messages, qui est probablement ce qui est le plus nécessaire. Si, dans un cas d'utilisation, vous avez une référence à un article et que vous souhaitez connaître le blog auquel il appartient, vous pouvez rechercher le blog en effectuant une recherche sur votre référentiel/dbcontext pour rechercher un objet Blog contenant ce message. listes de postes.

Les défenseurs de DDD recommandent souvent la navigation unidirectionnelle et les requêtes si la navigation dans la direction opposée est nécessaire.

+0

mais alors je perds la liaison entre les deux fichiers et essentiellement tuer le chargement paresseux (chargement même impatient) comme je ne peux plus faire Post.Blog.Id, je devrais écrire une requête séparée pour faire la même chose maintenant. Est-ce que cela ne limite pas EF? Je suis très nouveau à EF et je sais à Nhibernate que vous auriez besoin d'avoir Blog dans la poste sinon le lien ne se produirait jamais. On dirait que les ORM forcent cela même si je n'ai pas de référence circulaire du côté de la base de données, il existera dans les domaines. – chobo2

+0

Aucun chargement paresseux ne fonctionne parfaitement sans navigation bidirectionnelle. Ajout d'un exemple de code à la publication ci-dessus. –

+0

Ya Je parle de Messages au Blog pas de Blog aux Posts. Je suis tellement habitué à avoir accès à l'autre côté du domaine et comme je l'ai dit, c'est presque obligatoire avec Nhibernate. D'après ce que vous dites, ce n'est pas obligatoire avec EF mais je n'ai pas encore essayé. Que voulez-vous dire par «... interrogation et une association bidirectionnelle». – chobo2

Questions connexes