我在 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();
}
关于c# - 在 Entity Framework Core 3 中使用 TransactionScope 时 SET IDENTITY_INSERT 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847327/