2010-05-24 4 views
4

J'ai une table Customer avec une clé primaire (incrément auto int) et une table d'adresses avec une clé étrangère dans la table Customer. J'essaie d'insérer les deux lignes dans la base de données dans une transaction agréable.Utilisation de Linq2Sql pour insérer des données dans plusieurs tables à l'aide d'une clé primaire auto incrémentée

using (DatabaseDataContext db = new DatabaseDataContext()) 
{ 
    Customer newCustomer = new Customer() 
    { 
     Email = customer.Email 
    }; 

    Address b = new Address() 
    { 
     CustomerID = newCustomer.CustomerID, 
     Address1 = billingAddress.Address1 
    }; 

    db.Customers.InsertOnSubmit(newCustomer); 
    db.Addresses.InsertOnSubmit(b); 
    db.SubmitChanges(); 
} 

Quand je lance ce que j'espérais que la table et adresse du client avait automatiquement les touches correctes dans la base de données car le contexte sait que c'est une clé incrémentée automatique et fera deux inserts avec la touche droite dans les deux tableaux . La seule façon de faire fonctionner ceci est de faire d'abord SubmitChanges() sur l'objet Customer puis de créer l'adresse et de faire aussi SubmitChanges(). Cela créerait deux allers-retours vers la base de données et j'aimerais voir si je peux le faire en une seule transaction. C'est possible?

Merci

Répondre

2

Klaus essentiellement déjà spécifié ce que vous devez faire - essayez ce code:

using (DatabaseDataContext db = new DatabaseDataContext()) 
{ 
    Customer newCustomer = new Customer() 
    { 
     Email = customer.Email 
    }; 

    Address b = new Address() 
    { 
     Address1 = billingAddress.Address1 
    }; 

    newCustomer.Address = b; 

    db.Customers.InsertOnSubmit(newCustomer); 
    db.SubmitChanges(); 
} 

Si vous associez l'adresse b avec le client que vous venez de créer, puis insérez ce client dans la collection db.Customers, appeler db.SubmitChanges() devrait enregistrer automatiquement l'adresse, enregistrer le client et réparer l'une des colonnes IDENTITY pour faire ce travail. Cela fonctionne pour moi dans un cas de test, c'est sûr.

Vous ne pouvez pas encore utiliser l'adresse ou l'ID du client - ceux-ci n'ont pas encore été définis. Mais vous pouvez certainement associer les objets entiers entre eux et ainsi obtenir la "connexion" entre les deux en place.

Pour que cela fonctionne, vous devez vous assurer que le concepteur DBML, dans la fenêtre Properties pour les deux colonnes d'identité, le Auto Generated Value est True et Auto-Sync est ste à OnInsert (les deux ne sont pas les valeurs par défaut) .

1

Si vous avez une relation de clé étrangère dans la base de données l'objet Customer devrait avoir une collection appelée Addresses que vous pouvez Add votre instance d'adresse appelée à b. Si vous faites cela, vous n'avez pas besoin d'ajouter explicitement l'adresse à db.Addresses, il sera automatiquement ajouté par le framework, et le bon identifiant client sera inséré.

Questions connexes