使用Entity Framework将记录添加到内存优化表中

时间:2019-07-04 11:57:28

标签: c# sql-server entity-framework

我正尝试使用EF这样将记录添加到内存优化表中:

using (var db = new Context())
{
    db.Table.AddRange(newEntries);
    await db.SaveChangesAsync(cancellationToken);
}

并得到如下错误:

  

SqlException:使用READ访问内存优化表   仅自动提交支持COMMITTED隔离级别   交易。不支持显式或隐式   交易。提供内存支持的隔离级别   使用表提示(例如WITH(SNAPSHOT))优化表。

如何找出此问题的原因?

1 个答案:

答案 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);

我知道这可能不是最佳选择,并且在每种情况下都无济于事。