2012-03-19 3 views
1

je la classe C# suivante:Entity Framework cartographie étrange

public class SomeClass{ 
    public string Name; 
    public List<SomeClass> List1; 
    public List<SomeClass> List2; 
} 

Quand j'ai 2 cas de SomeClass (SomeClass1 et SomeClass2) et faire quelque chose comme:

SomeClass1.List1.Add(SomeClass2); 

Il ajoute également SomeClass1 à SomeClass2.List2 pour une raison quelconque lorsque context.SaveChanges() est appelé. Comment puis-je empêcher cela?

Editer: J'utilise d'abord le code. Merci

+1

Il est impossible de dire sans voir le mappage que vous avez créé. S'il vous plaît fournissez-le. –

+0

c'est le code d'abord? –

+0

C'est le code d'abord. J'ai oublié d'ajouter ça. – Fritsie

Répondre

1

Si vous n'avez pas de mappage avec l'API Fluent, EF créera un mappage basé sur les conventions. La convention dans ce cas est que List1 et List2 sont les inverses les propriétés de navigation de la même relation - dans ce cas, une relation plusieurs-à-plusieurs "autoréférencement".

L'effet que vous rencontrez est une relation automatique fixup qui est exécutée lorsque DetectChanges() est appelé (ou SaveChanges() qui appelle DetectChanges() interne). Cette correction met automatiquement à jour les propriétés de navigation inversées des entités attachées afin qu'elles soient cohérentes les unes avec les autres. Vous ne pouvez pas empêcher cela et cela ne devrait pas être un problème.

Modifier

Si vous ne voulez pas un mappage entre les deux listes, vous devez spécifier un mappage explicite avec l'API Fluent. Par exemple: Si les deux listes appartiennent à séparer un à-plusieurs, vous devez spécifier:

modelBuilder.Entity<SomeClass>() 
    .HasMany(s => s.List1) 
    .WithRequired()    // or WithOptional() 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<SomeClass>() 
    .HasMany(s => s.List2) 
    .WithRequired()    // or WithOptional() 
    .WillCascadeOnDelete(false); 

Cette cartographie indique que la seconde extrémité de chaque relation ne soit pas exposé dans le modèle (donc WithRequired()/WithOptional() sans paramètre) . Similaire vous pouvez spécifier deux relations plusieurs-à-plusieurs avec HasMany(s => s.List1/2).WithMany().Map(...).

+0

Y a-t-il un moyen d'annuler cette relation? Ce n'est pas mon intention que les listes soient inverses les unes des autres. – Fritsie

+0

@Fritsie: Voir mon édition. – Slauma

Questions connexes