Как заставить 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 делает все возможное.