我在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
一起使用?
答案 0 :(得分:2)
您需要自己打开和关闭连接,否则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();
}