使用实体框架将记录添加到内存优化的表中



我正在尝试使用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);

我知道这可能不是最佳的,并且在每种情况下都没有帮助。

最新更新