在使用Entity Framework Core 3中的TransactionScope时,SET IDENTITY_INSERT无法正常工作

4

我在使用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时使其正常工作?
1个回答

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接