c# - 在 Entity Framework Core 3 中使用 TransactionScope 时 SET IDENTITY_INSERT 不起作用

标签 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();
}

我得到以下错误

Cannot insert explicit value for identity column in table 'Items' when IDENTITY_INSERT is set to OFF.

此代码确实有效:

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

如何让它与 TransactionScope 一起工作?

最佳答案

您需要自己打开和关闭连接,否则 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://learn.microsoft.com/en-us/ef/core/saving/explicit-values-generated-properties#explicit-values-into-sql-server-identity-columns

关于c# - 在 Entity Framework Core 3 中使用 TransactionScope 时 SET IDENTITY_INSERT 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847327/

相关文章:

c# - 来自 Veracode 的 "Improper Resource Shutdown or Release"错误,为什么?

asp.net-core - 使用同一个类(模型)创建两个表

entity-framework-core - 如何在 Entity Framework Core 中构建递归表达式树?

c# - EntityFramework Core 1.1.1 - 用新值和覆盖值替换旧集合

c# - 使用 NHibernate 保存和加载 Utc DateTime

c# - 如何在没有 Winforms 的情况下使用 ClassLibrary 中的 ActiveX 组件

c# - 如何从嵌套在另一个泛型类中扩展我的类?

c# - HttpClient的多种实现

c# - 如何导入词典文本文件并检查单词匹配?

c# - 升级到 .Net Core 2.1 时找不到版本为 (>= 2.1.0) 的包 Microsoft.Extensions.SecretManager.Tools