【问题标题】:SET IDENTITY_INSERT not working when using TransactionScope in Entity Framework Core 3在 Entity Framework Core 3 中使用 TransactionScope 时,SET IDENTITY_INSERT 不起作用
【发布时间】:2019-11-13 23:47:15
【问题描述】:

我在 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 时,无法为表“Items”中的标识列插入显式值。

此代码确实有效:

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

如何使它与TransactionScope 一起工作?

【问题讨论】:

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


    【解决方案1】:

    您需要自己打开和关闭连接,否则 EF 将为每个操作打开/关闭。您的 ExecuteRawSql 和您的 SaveChanges 有效地在不同的连接上完成。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 2023-03-14
      • 2023-03-18
      • 2017-03-13
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多