Обновление оптимизированной для памяти таблицы

У меня есть оптимизированная для памяти таблица в SQL Server 2017 под названием «Пользователь».
Я собираюсь обновить строку следующим образом:

using (var context = new MyDbEntities())
{
    var user = context.Users.Single(p => p.UserId == 1);
    user.Name = "John";
    context.SaveChanges();
}

В операторе SaveChanges() появляется это исключение:

Доступ к оптимизированным для памяти таблицам с использованием уровня изоляции READ COMMITTED поддерживается только для транзакций с автоматической фиксацией. Он не поддерживается для явных или неявных транзакций. Укажите поддерживаемый уровень изоляции для таблицы, оптимизированной для памяти, с помощью табличной подсказки, например WITH (SNAPSHOT).

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

alter database MyDb set ALLOW_SNAPSHOT_ISOLATION ON

Также использовал транзакцию с изоляцией Snapshot в моем коде, но ничего не добился.


person Mehrdad    schedule 04.01.2018    source источник
comment
ALTER DATABASE myDB SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON; помощь?   -  person BugFinder    schedule 04.01.2018
comment
@BugFinder На самом деле это помогло!   -  person Mehrdad    schedule 04.01.2018
comment
@Equalsk Вы правы, я нашел этот ответ, но, к сожалению, я не пробовал эту часть кода в длинном ответе.   -  person Mehrdad    schedule 04.01.2018
comment
Не беспокойтесь об этом, это нормально помечать дубликаты таким образом :-)   -  person Equalsk    schedule 04.01.2018


Ответы (1)


Entity Framework оборачивает вызов SaveChanges() в транзакцию для вас с уровнем изоляции транзакции по умолчанию (для SQL Server) READ COMMITTED.

Вы можете самостоятельно обернуть свой код Entity Framework в транзакцию, например:

using (var conn = new SqlConnection("...")) 
{ 
    conn.Open(); 
    using (var sqlTxn = conn.BeginTransaction(System.Data.IsolationLevel.Snapshot)) 
    { 
        using (var context =  new MyDBEntities(conn, contextOwnsConnection: false)) 
        { 
            context.Database.UseTransaction(sqlTxn);
            // ...
        }

    }
}

См. документацию: https://msdn.microsoft.com/en-us/library/dn456843(v=vs.113).aspx

person jeroenh    schedule 04.01.2018
comment
MyDBEntities не принимает параметры. На самом деле решение @BugFinder сработало. Я просто должен проверить его возможные минусы - person Mehrdad; 04.01.2018