3 sql-server entity-framework in-memory-database memory-optimized-tables sql-server-2016
在内存 OLTP 表中访问实体框架是否有任何限制?或者这是不可能的?
我创建了一个小型测试应用程序,以查看从实体框架访问 IMOLTP 表是否存在任何问题。我的测试应用程序使用实体框架 (EF6) 的最新稳定版本。
使用默认设置,我最初尝试将行插入内存优化表时遇到此错误:
SqlException:仅自动提交事务支持使用 READ COMMITTED 隔离级别访问内存优化表。它不支持显式或隐式事务。使用表提示为内存优化表提供受支持的隔离级别,例如 WITH (SNAPSHOT)。
这是因为实体框架在使用“SaveChanges()”方法(插入行的最常见方法)时自动创建显式事务:
在实体框架的所有版本中,每当您执行 SaveChanges() 以在数据库上插入、更新或删除时,框架都会将该操作包装在事务中。
在 EF 的情况下,解决此问题的最简单方法是打开数据库级选项MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT,它本质上会WITH (SNAPSHOT)自动添加所需的提示:
ALTER DATABASE [YourDatabaseName] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ON;
Run Code Online (Sandbox Code Playgroud)
除此之外,访问内存表似乎没有问题。这并不令人惊讶,因为在幕后实体框架正在使用 SQL Server (SqlClient) 的 .NET Framework 数据提供程序,它在涉及内存表时没有记录的限制。