2010-09-03 4 views
0

Je cela me deviens fou,LINQ to SQL SubmitChanges() insère deux lignes de base de données et un enfant Row

Je joins une liste avec 1 client et 1 Adresse ligne d'enregistrement des enfants. Tout semble OK pendant le débogage. 1 ligne de client et 1 ligne d'adresse doivent être insérées. Mais à la place, je reçois 2 enregistrements client et 1 ligne d'adresse.

Je ne sais pas pourquoi. Lors de l'attachement et de la mise en boucle dans la liste, seulement 1 enregistrement vu.

Tous les points?

[edited]

code

Ci-joint:

public bool InsertUpdateCustomers(List<Customer> customerList, List<Customer> originalCustomers) 
{ 
    using (DbContext db = new DbContext(DbContext.ConnectionString)) 
    { 
     db.Log = Console.Out; 
     List<Customer> customerCloned = new List<Customer>(); 
     customerList.ForEach(p => customerCloned.Add(p.CloneObjectGraph())); 
     customerCloned.ForEach(p => p.Address = 
      customerList.Where(pe => pe.Id == p.Id).Single().Address.CloneObjectGraph()); 

     customerCloned.ForEach(p => 
     { 
      if (p.Id > 0) 
      { 
       db.Customer.Attach(p, 
            originalCustomers.Single(
             x => x.Id == p.Id)); 
       db.Address.Attach(p.Address, 
            originalCustomers.Single(
             x => p.AddressId== x.AddressId). 
             Address); 
      } 
     }); 
     customerCloned.ForEach(p => 
     { 
      if (p.Id == 0) 
       db.Customer.InsertOnSubmit(p); 
     }); 


     try 
     { 
      db.SubmitChanges(ConflictMode.ContinueOnConflict); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 
    } 
} 

J'ai vérifié le journal de la sortie et je vois en effet 2 insertions dans la table. Je ne vois rien sur l'adresse, mais insère correctement.

Il pourrait être le problème clé étrangère que je ne comprends pas.

+0

Fixer un exemple de code bro. – hydrogen

+0

1 minute s'il vous plaît. – AlwaysBeCoding

+0

ce qui est originalClients ???? – DEVMBM

Répondre

0

Je suppose que vous avez résolu ce pour l'instant, mais je suis tombé sur un problème similaire et je voulais faire rapport ma compréhension de cette question pour les futurs utilisateurs.

La question, je crois, est que vous utilisez une liste existante d'objets clients récupérés à partir du DB en utilisant un DataContext particulier. Vous créez ensuite un nouveau DataContext dans votre méthode et, avec ce nouveau DataContext, vous attachez un objet Address. Cet objet Address (en supposant que la relation de clé étrangère avec Customer) crée un nouvel objet Customer dans la base de données depuis le DataContext pour lequel SubmitChanges est appelé, l'originalCustomer est également traité comme un nouvel enregistrement. En d'autres termes, pour éviter ces problèmes, vous devez réutiliser le DataContext existant en utilisant la liste originaleCustomer List pour que l'insertion de l'enregistrement enfant de l'adresse ne déclenche pas d'entrée dans la table parent.

Espérons que cela aide.

Questions connexes