Как заставить Entity Framework не блокировать базу данных

Возможный дубликат:
Entity Framework с NOLOCK

Я использую EF4 и .Net 4 для загрузки некоторого XML из файла в базу данных.

У меня есть класс, обертывающий объект ObjectContext, и у него есть методы, которые добавляют маршаллированные объекты из XML файла в различные EntityCollections, которые представляют мои таблицы.

Каждый файл XML содержит в среднем около 200 000 объектов, класс-оболочка создает объект ObjectContext при построении и сохраняет ссылку в локальной переменной частного класса, которая затем используется этими методами.

Когда я закончил создание объектов, я вызываю:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

Это создает транзакцию на сервере, которая соответствует проекту EntityFramework. Однако эта транзакция полностью блокирует мою БД даже на таблицах, которые не добавляются.

Я пробовал разные вещи, чтобы попытаться обойти это, включая обертку, сохранить изменения в TransactionScope следующим образом:

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

            transaction.Complete();
       }

Я также попытался создать TransactionScope перед созданием ObjectContext в попытке повлиять на основную транзакцию, используемую во время SaveChanges.

В идеале я хотел бы загружать сразу несколько файлов, но это будет невозможно, если БД заблокирована во время сохранения изменений.

Кто-нибудь знает об этом? Не удается ли заставить EntityFramework не использовать транзакцию?

Спасибо за любую помощь заранее.

Джеймс

Ответы

Ответ 1

Просто чтобы положить это на кровать, я собираюсь опубликовать то, что было моим решением.

В основном я смотрел на это с неправильного конца проблемы, транзакция используется при вызове SaveChanges(), но вы все равно можете читать базу данных, используя такой способ:

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

Это устанавливает уровень изоляции перед тем, как вы попытаетесь прочитать.

Это обычно не рекомендуется, так как вы можете читать "грязные" частичные данные, но за то, что im делает все возможное.