我正尝试使用EF这样将记录添加到内存优化表中:
using (var db = new Context())
{
db.Table.AddRange(newEntries);
await db.SaveChangesAsync(cancellationToken);
}
并得到如下错误:
SqlException:使用READ访问内存优化表 仅自动提交支持COMMITTED隔离级别 交易。不支持显式或隐式 交易。提供内存支持的隔离级别 使用表提示(例如WITH(SNAPSHOT))优化表。
如何找出此问题的原因?
答案 0 :(得分:0)
编辑:
根据@Jeroen Mostert的建议,我确实打开了数据库上的MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
,并且无需费心StoreGeneratedPattern
就可以正常工作。我仍然有点怕打开生产数据库。
原始:
我添加了日志记录:
using (var db = new Context()) {
db.Database.Log = l => Trace.WriteLine(l);
同一张表中有一个带有SELECT的INSERT(没有SNAPSHOT提示)。
在.edmx中,内存优化表的时间戳字段已将StoreGeneratedPattern
设置为Identity
。该表具有SYSDEFAULT()CONSTRAINT。
将StoreGeneratedPattern
设置为None
导致SaveChanges
仅产生INSERT,并且没有例外。
对于我而言,首先获取SYSDATETIME,更新时间戳字段,然后保存它们是可行的:
DateTime dbDate = await db.Database.SqlQuery<DateTime>("SELECT SYSDATETIME()").SingleAsync(cancellationToken);
entries.ForEach(l => l.TimestampField = dbDate);
db.Table.AddRange(entries);
await db.SaveChangesAsync(cancellationToken);
我知道这可能不是最佳选择,并且在每种情况下都无济于事。