【发布时间】:2018-07-01 04:39:32
【问题描述】:
我们的一个内部应用程序中有一个相当重的模块,它使用 SignalR 检查新通知。我们被告知我们正在数据库上创建锁,并且我们应该对有问题的方法进行未提交的读取。
这不是我以前必须做的事情,据我所知,EF 默认情况下会提交对记录的读取。因此,我将现有查询包装在另一个 using 语句中,如下所示:
public IEnumerable<ClientUpdates> GetNotifications(int forPaId)
{
using (var transactionScope =
new TransactionScope(TransactionScopeOption.Required, GetReadUncommitedTransactionOptions()))
{
using (var ctx = ContextFactory.CompanyDb)
{
// Do stuff
transactionScope.Complete();
return objectList;
}
}
}
private TransactionOptions GetReadUncommitedTransactionOptions()
{
var transactionOptions = new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadUncommitted
};
return transactionOptions;
}
这会导致以下错误消息:
InvalidOperationException: 警告作为警告的错误异常 'Microsoft.EntityFrameworkCore.Database.Transaction.AmbientTransactionWarning': 已检测到环境事务。实体框架核心 不支持环境事务。看 http://go.microsoft.com/fwlink/?LinkId=800142 压制这个 异常使用 DbContextOptionsBuilder.ConfigureWarnings API。 覆盖时可以使用 ConfigureWarnings DbContext.OnConfiguring 方法或使用 AddDbContext 上 应用服务提供商。
因此我试图抑制警告:
services.AddDbContext<DbContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString"));
options.ConfigureWarnings(x => x.Ignore(RelationalEventId.AmbientTransactionWarning));
});
这会导致此错误消息:
NotSupportedException:在环境事务中登记不是 支持。
所以现在我有点迷茫,我可以看到其他人已经在official issue tracker 上记录了这个问题,但我不明白实际问题是什么,以及如何强制这个特定模块执行“ Dirty” 读取数据,从而阻止锁的发生。
【问题讨论】:
标签: c# entity-framework-core asp.net-core-2.0