在实体框架核心3中使用TransactionScope时,SET IDENTITY_INSERT不起作用

时间:2019-11-13 23:47:15

标签: c# .net-core entity-framework-core

我在EF Core 3中使用TransactionScope时遇到问题。下面的代码在使用Database.BeginTransaction时工作正常,但在使用TransactionScope时工作不正常。 下面的代码不起作用:

using (var ts = new TransactionScope(option, new TransactionOptions
            {
                Timeout = TransactionManager.MaximumTimeout,
                IsolationLevel = isolation
            }, TransactionScopeAsyncFlowOption.Enabled))
{
    Context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT ITEMS ON");
    Context.Item.Add(item);
    Context.SaveChanges();
}

我收到以下错误

  

当IDENTITY_INSERT设置为OFF时,无法在表“项目”中为标识列插入显式值。

此代码确实有效:

using(var ts = Context.Database.BeginTransaction())
{
    Context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT ITEMS ON");
    Context.Item.Add(item);
    Context.SaveChanges();
    ts.Commit();
}

如何使其与TransactionScope一起使用?

1 个答案:

答案 0 :(得分:2)

您需要自己打开和关闭连接,否则EF将为每个操作打开/关闭。您的ExecuteRawSqlSaveChanges实际上是在不同的连接上完成的。

Context.Item.Add(item);
Context.Database.OpenConnection();
try
{
    Context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT ITEMS ON");
    Context.SaveChanges();
    Context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT ITEMS OFF");
}
finally
{
    Context.Database.CloseConnection();
}

参考:https://docs.microsoft.com/en-us/ef/core/saving/explicit-values-generated-properties#explicit-values-into-sql-server-identity-columns