2010-11-02 15 views
1

J'utilise EF depuis presque un an. Je viens d'essayer d'utiliser TransactionScope face à une requête assez complexe comme le code suivant.Pourquoi Entity Framework 4.0 nécessite-t-il l'utilisation de DTM? Est-il possible de ne pas l'utiliser?

using (var tran = new TransactionScope()) 
{ 
    // Clear all data in some table 
    DataContext.SomeTables 
     .ForEach(x => DataContext.SomeTables.DeleteObject(x)); 

    DataContext.SaveChanges(); 

    // Import data from excel as DataSet object. 
    var ds = ImportDataFromExcel(file.FullName); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     DataContext.SomeTables.AddObject(new SomeTable 
     { 
      // fill object with data from current row. 
     }); 
    } 

    DataContext.SaveChanges(); 

    // Commit Transaction 
    tran.Complete(); 
} 

Après cela, j'ai eu une erreur à propos de DTM n'est pas activé ou accessible. Je sais que cause par ce service au serveur de base de données n'est pas démarré ou bloqué par pare-feu. Mais ce n'est pas mon point.

Je veux savoir pourquoi EF utilise ce service pour créer une transaction alors que le script SQL simple ne peut utiliser que certaines instructions comme "BEGIN TRAN", "SAVE TRAN" ou "ROLLBACK TRAN".

Existe-t-il un autre moyen d'éviter d'appeler le service DTM pour ma déclaration de transaction assez simple?

PS. La base de données de travail actuelle est si petite et je pense qu'elle ne devrait pas être affectée par différentes techniques de transaction.

Merci,

Répondre

2

Après je recherche beaucoup de sites, je viens de trouver que je peux créer manuellement transaction en utilisant la transaction entité comme le code source suivant.

using (var tran = DataContext.BeginTransaction()) 
{ 
    // Clear all data in some table 
    DataContext.SomeTables 
     .ForEach(x => DataContext.SomeTables.DeleteObject(x)); 

    DataContext.SaveChanges(); 

    // Import data from excel as DataSet object. 
    var ds = ImportDataFromExcel(file.FullName); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     DataContext.SomeTables.AddObject(new SomeTable 
     { 
      // fill object with data from current row. 
     }); 
    } 

    DataContext.SaveChanges(); 

    // Commit Transaction 
    tran.Commit(); 
} 

Classe d'assistance

public static DbTransaction BeginTransaction(this ObjectContext context, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted) 
{ 
    if (context.Connection.State != ConnectionState.Open) 
    { 
     context.Connection.Open(); 
    } 

    return context.Connection.BeginTransaction(isolationLevel); 
} 

Merci à Kim Major pour répondre à la question suivante. Je ne peux pas trouver d'autres pages qui me suggèrent clairement d'utiliser la transaction Entity, y compris le site principal MSDN (How to: Manage Transactions in the Entity Framework).

How to use transactions with the Entity Framework?