1

我在 SQL Server 2017 中有一个名为“用户”的内存优化表。
我要将一行更新为:

使用 (var context = new MyDbEntities())
{
    var user = context.Users.Single(p => p.UserId == 1);
    user.Name = "约翰";
    context.SaveChanges();
}

在 SaveChanges() 语句中,出现此异常:

仅自动提交事务支持使用 READ COMMITTED 隔离级别访问内存优化表。显式或隐式事务不支持它。使用诸如 WITH (SNAPSHOT) 之类的表提示为内存优化表提供支持的隔离级别。

我尝试更改数据库上的一些选项,例如:

更改数据库 MyDb 设置 ALLOW_SNAPSHOT_ISOLATION ON

在我的代码中也使用带有快照隔离的事务,但没有实现。

4

1 回答 1

-1

实体框架为您将 SaveChanges() 调用包装在事务中,默认情况下事务的隔离级别(对于 SQL Server)已提交。

您可以自己将实体框架代码包装在事务中,例如:

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

于 2018-01-04T09:23:18.267 回答