Comment forcer Entity Framework à ne pas verrouiller la base de données

entity-framework transactions

Question

Dupliquer possible:
Entity Framework avec NOLOCK

J'utilise EF4 et .Net 4 pour charger du XML dans un fichier dans une base de données.

J'ai une classe qui enveloppe l'objet ObjectContext et des méthodes qui ajoutent les objets classés du fichier XML aux divers EntityCollections qui représentent mes tables.

Chaque fichier XML contient environ 200 000 objets en moyenne, la classe wrapper crée le ObjectContext lors de la construction et stocke la référence dans une variable de classe privée locale qui est ensuite utilisée par les méthodes.

Quand j'ai fini de créer les entités que j'appelle:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

Cela crée une transaction sur le serveur conforme à la conception EntityFramework. Cependant, cette transaction verrouille complètement ma base de données, même sur des tables non ajoutées.

J'ai essayé diverses solutions pour contourner ce problème, notamment intégrer des modifications de sauvegarde dans un TransactionScope comme ceci:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress,
       new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
       {
            entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

            transaction.Complete();
       }

J'ai également essayé de créer TransactionScope avant de créer ObjectContext afin d'influencer la transaction sous-jacente utilisée lors de SaveChanges.

Idéalement, j'aimerais charger plusieurs fichiers à la fois, mais cela sera impossible si la base de données est verrouillée pendant l'enregistrement des modifications.

Est-ce que quelqu'un connaît un travail autour de cette question? Faut-il forcer EntityFramework de ne pas utiliser une transaction?

Merci d'avance pour toute aide.

James

Réponse acceptée

Juste pour mettre ça au lit, je vais poster ce que ma solution était.

En gros, je regardais cela du mauvais côté du problème. Une transaction est utilisée lors de l'appel de SaveChanges() mais vous pouvez toujours lire la base de données en utilisant une méthode comme celle-ci:

private static FrameEntities GetEntities()
    {
        FrameEntities entities = new FrameEntities();
        entities.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
        return entities;
    }

Cela définit le niveau d'isolement avant d'essayer de lire.

Ce n’est normalement pas recommandé car vous pouvez lire des données incomplètes mais "sales", mais pour ce qui est correct.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow