2009-03-17 8 views
0

J'ai 3 entitésInsertion de plusieurs entités associées dans un db en utilisant Entity Framework, que fais-je de mal?

  • imprimante
  • serveur
  • pilote

L'imprimante possède des propriétés du serveur et le pilote

Somwhere dans mon code, je l'ai mis en place un < IEnumerable Imprimante > où chaque instance de l'imprimante contient ses propres entités Serveur et Pilote.

Maintenant, quand je suis en train de le soumettre à la DB, je suis en utilisant le code suivant:

foreach (Printer p in printers) 
    { 
    printmanEntities _dc = new printmanEntities(); 
    p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver; 
    p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server; 

    _dc.AddToPrinterSet(p); 

    _dc.SaveChanges(); 
    } 

On suppose que je vais obtenir un enregistrement pour chaque objet imprimante, et un seul enregistrement pour chaque nom de pilote et serveur unique. Mais le résultat actuel est plutôt câblé.

Le code ci-dessus produit un enregistrement unique pour chaque objet Pilote unique, mais crée sans raison apparente plus d'un enregistrement pour chaque serveur unique. Et tous les enregistrements d'imprimante pointent vers un seul enregistrement de serveur.

En outre, si j'affecte p.Server en premier, alors je ne reçois que des enregistrements uniques pour les entités du serveur mais plusieurs enregistrements pour les entités du pilote.

Qu'est-ce que je fais mal?

Mise à jour: Remplacé EF avec LINQ2SQL et cela a fonctionné comme prévu. Une seule ligne pour chaque entité unique, rien de plus.

Répondre

0

Étrangement, DataContainer ne retourne pas les entités que vous trouverez ci-joint à un graphique, mais n'ont pas passé db comme résultat de la requête. Vous ne pouvez donc pas obtenir l'entité que vous avez ajoutée, mais vous ne pouvez pas l'utiliser avec Select().) -:

0

Cela suggère que dc.ServerSet.FirstOrDefault (s => s.Name == p.Server.Name) renvoie null, mais l'appel du pilote renvoie un enregistrement. Pourquoi? Je ne sais pas. Regardez SQL Profiler et voyez ce qui revient du serveur de base de données. Cela expliquerait vos résultats, cependant.

Mise à jour: Je pense que j'ai peut-être compris ce qui se passe ici. Essayez et modifiez votre code comme suit. Si cela fonctionne, je vais expliquer le raisonnement.

printmanEntities _dc = new printmanEntities(); 
_dc.AddToPrinterSet(p); 

p.Driver = _dc.DriverSet.FirstOrDefault(d => d.Name == p.Driver.Name) ?? p.Driver; 
p.Server = _dc.ServerSet.FirstOrDefault(s => s.Name == p.Server.Name) ?? p.Server; 

_dc.SaveChanges(); 

Notez que la seule chose que j'ai faite ici était de changer l'ordre des opérations.

+0

Comme câblé que cela puisse paraître, il ne retourne une valeur appropriée, et toutes les imprimantes de table db sont liées à bon serveur. Je suppose que je viens de trouver un bug filaire. –

+0

Quelque chose d'autre se passe alors. Je ne peux pas dire quoi de l'exemple, mais je n'ai jamais vu Entity Framework faire ce genre de chose de façon incorrecte. –

+0

Essayez ce code mis à jour. –

Questions connexes