【问题标题】:Updating Memory Optimized Table [duplicate]更新内存优化表 [重复]
【发布时间】:2018-01-04 09:07:46
【问题描述】:

我在 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

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

【问题讨论】:

  • 是否“ALTER DATABASE myDB SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;”帮忙?
  • @BugFinder 实际上确实有帮助!
  • @Equalsk 你说得对,我找到了答案,但不幸的是我没有在长答​​案中尝试那部分代码
  • 别担心,这样标记重复是很正常的:-)

标签: c# entity-framework-6 sql-server-2017 memory-optimized-tables


【解决方案1】:

Entity Framework 为您将 SaveChanges() 调用包装在事务中,默认情况下事务的隔离级别(对于 SQL Server)READ COMMITTED。

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

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

【讨论】:

  • MyDBEntities 不接受参数。实际上@BugFinder 解决方案有效。我只是应该检查它可能的缺点
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多