2016-08-02 1 views
0

J'ai été à la recherche d'une solution toute la journée, mais je ne pouvais pas trouver si ici, je suis à la recherche d'aide.Comment insérer en bloc dans Entity Framework v4?

J'ai trois tables pour enregistrer les groupes & leurs contacts dans ma base de données. Par souci de simplicité, considèrent que leur nom table_1, table_2 & table_3

table_1 (groupe Table)

+----------+------+ 
| Group_Id | Name | 
+----------+------+ 
|  1 | A | 
|  2 | B | 
|  3 | C | 
+----------+------+ 

table_2 (Contact Table):

+------------+-------+--------+ 
| Contact_Id | name | number | 
+------------+-------+--------+ 
|   1 | Jack | 123 | 
|   2 | Sam | 456 | 
|   3 | Alice | 789 | 
+------------+-------+--------+ 

table_3 (Tableau de jonction)

+-----------------+----------+------------+ 
| ContactGroup_Id | Group_Id | Contact_Id | 
+-----------------+----------+------------+ 
|    1 |  1 |   1 | 
|    2 |  2 |   2 | 
|    3 |  2 |   3 | 
+-----------------+----------+------------+ 

Maintenant, je lis le fichier Excel dans mon application web et t lors de l'ajout de contacts en masse à la base de données. En utilisant EF4, ce que je suis en train de faire:

using (TransactionScope obj = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted, Timeout = TransactionManager.MaximumTimeout })) 
{ 
    for (int i = 1; i < totalrows; i++) 
    { 
    table_2 objTable_2 = new table_2(); 
    objTable_2.name = "ABC"; 
    objTable_2.number= "999"; 
    entity.table_2.AddObject(objTable_2); 
    entity.SaveChanges(); 

    table_3 objTable_3 = new table_3(); 
    objTable_3.Group_Id = "1"; 
    objTable_3.Contact_Id = objTable_2.Contact_Id; 
    entity.table_3.AddObject(objTable_3); 
    entity.SaveChanges(); 
    } 
} 

Maintenant, comme vous pouvez le voir, je dois appeler entity.SaveChanges() chaque fois pour obtenir le PK de table_2 généré automatiquement à insérer dans table_3. Faire cela pour des centaines ou des milliers d'enregistrements ralentit vraiment mon application et je sais que c'est une mauvaise façon de le faire.

Y a-t-il d'autres solutions pour cela? si je le fais en utilisant une extension d'insertion en bloc tierce ou en appelant SaveChanges() après tous les quelques centaines d'enregistrements alors comment puis-je obtenir PK PK table_2 pour insérer dans table_3?

+0

Est-ce que vous avez un coup d'oeil à ma réponse mise à jour? Envisager de le marquer comme solution si cela a aidé – bsoulier

Répondre

0

Jetez un oeil à this extension pour Entity Framework, qui est compatible avec EF à partir de la version 4.x à 6.x. Je l'ai utilisé plusieurs fois, et ça fonctionne plutôt bien.

Edit:

Résoudre le problème de PK par iserting items within a stored procedure, faire toutes les insertions de dans un appel, afin d'éviter des milliers de voyages aller-retour entre les inserts de manipulation du code .NET et SQL Server

+0

Je connais cette extension, mais cela ne résout pas mon problème PK auto-généré. – NewbieProgrammer

+0

Désolé pour mal lire votre problème, je dirais que dans ce cas, vous devriez aller construire une procédure stockée. Cela permettrait de gérer toutes les étapes à la fois, en supprimant tous les allers-retours entre votre application et votre DB. – bsoulier

+0

Je vois. Mais si j'ai besoin de traiter 10000 contacts, je devrai exécuter la procédure stockée 10000 fois. Droite? cela ne sera-t-il pas le même (en termes de performance)? Et qu'en est-il de la transaction? comment puis-je faire cela dans la procédure stockée pour tous les enregistrements? – NewbieProgrammer