【问题标题】:MVC 5 DBContext Dependency Injection IssueMVC 5 DBContext 依赖注入问题
【发布时间】: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


【解决方案1】:

所以问题是上下文没有被处理,所以它就像一个单身人士。经过一番搜索,我找到了解决问题的这两个答案。

对于我使用this 的主控制器。这里的关键是“ServiceScopeModule”类。这处理了作用域资源的处置。

对于 Web API 控制器,我实现了来自 here 的答案。特别是“MsDiHttpControllerActivator”类。

我现在在 MVC 5 中获得了一个适当范围的 DbContext,它在结束请求之后进行处置。

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2010-12-10
    • 2015-11-21
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多