我正在尝试使用EF添加记录在内存优化表中,例如:
using (var db = new Context())
{
db.Table.AddRange(newEntries);
await db.SaveChangesAsync(cancellationToken);
}
并获得以下错误的错误:
sqlexception:使用读取访问内存优化表 仅适用于自动参与者,投入隔离水平 交易。它不支持明确或隐式 交易。为内存提供支持的隔离水平 使用表提示的优化表,例如(快照(。
我如何找出此问题的原因?
编辑:
遵循@Jeroen Mostert建议,我确实在数据库上打开了MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
,并且它不需要使用StoreGeneratedPattern
。不过,我仍然有点害怕在生产数据库上打开它。
原始:
我添加了记录:
using (var db = new Context()) {
db.Database.Log = l => Trace.WriteLine(l);
有一个从同一表中选择的插入物(没有快照提示(。
在.edmx中,内存优化表的时间戳字段将StoreGeneratedPattern
设置为Identity
。该表具有sysdefault((约束。
将StoreGeneratedPattern
设置为None
导致SaveChanges
仅产生插入,也不例外。
在我的情况下,首先获取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);
我知道这可能不是最佳的,并且在每种情况下都没有帮助。