【发布时间】:2020-05-27 09:48:21
【问题描述】:
我将 MVC5 与 EF Core 2.2 和 DI 一起使用。我将 DbContext 设置为 Scoped,但看起来它的行为就像一个单例。
请求 1:创建事务范围。在 DbContext 中创建一个新的 object1 并添加它,创建一个新的 object2 添加它但失败并且事务回滚。
请求 2:创建事务范围。在 DbContext 中创建新的 object1,但由于它已经跟踪请求 1 的更改而失败。它不在数据库中。重启网络应用允许第一个请求再次通过(因为跟踪器是清晰的)
如果第二个请求应该是一个全新的上下文,并且没有任何跟踪内容,我不知道它如何仍在跟踪该对象。如果我不使用 DI 而只是在控制器中实例化上下文,它就可以工作。
错误:无法跟踪实体类型的实例,因为已在跟踪具有相同键的该类型的另一个实例
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString, builder =>
{
builder.UseRowNumberForPaging();
});
}, ServiceLifetime.Scoped);
services.AddScoped(typeof(ChairManager));
ChairController 与 Manager 类的 DI
public ChairController(ChairManager chairManager, IServiceProvider services)...
具有上下文 DI 的 ChairManager 类
public ChairManager(ApplicationDbContext context)...
ChairController 调用 ChairManager 方法
await _chairManager.AddChairAsync(chair)
现在,如果我做这样的事情,不要使用 DI。完全没有问题...
public ChairController(IServiceProvider services)
{
var context = ApplicationDbContext.Create();
_chairManager = new ChairManager2(context);
}
...
await _chairManager.AddChairAsync(chair)
【问题讨论】:
-
您能否提供一个代码示例,说明
AddChairAsync的实现方式以及确切的错误消息? -
我用错误更新了帖子,但我也发现了这个问题。我部分正确。范围内的上下文没有被释放。
标签: asp.net-mvc model-view-controller dependency-injection asp.net-mvc-5 ef-core-2.2