asp.net - 填充使用 new 创建的 DbContext(EF7、ASP.NET 5、vnext)后,依赖项注入(inject) DbContext 为空

标签 asp.net entity-framework dbcontext asp.net-core entity-framework-core

我对 EF7 比较陌生,并且听说将 DbContext 依赖注入(inject)到 Controller 构造函数中是获取 DbContext 以在给定 Action 方法中使用的好方法。然而,很多情况下依赖注入(inject)是不可能的(例如,访问普通类中的 Db),必须使用 using(VectorDbContext dbContext...) 模式。

我遇到了一个问题,即向使用 using 模式创建的 DbContext 添加数据无法由依赖注入(inject)的上下文访问。 DbContext 是一个用于测试的简单 InMemory 数据库 - 它不连接到任何东西。

这里是将实体添加到 DbContext 的代码,为了测试我在 Startup.cs 中调用它:

using (ExampleDbContext dbContext= new ExampleDbContext()) {
    dbContext.Things.Add(
        new Thing() {
            Stuff= "something"
        });

    dbContext.SaveChanges();
}

这是 Controller 内的访问代码:

public class ExampleController : Controller {
    public ExampleController(ExampleDbContext exampleDbContext) {
        this.ExampleDbContext= exampleDbContext;
    }

    public ExampleDbContext ExampleDbContext { get; set; }

    public async Task<IActionResult> ExampleAction() {

        // new DbContext:
        using(ExampleDbContext dbContext = new ExampleDbContext ()) {
            var List1 = (await dbContext.Things
                .AsNoTracking()
                .ToListAsync());
        }

        // Injected DbContext:
        var List2 = (await this.ExampleDbContext.Things
            .AsNoTracking()
            .ToListAsync());
    }
}

单步执行时,List1 中包含预期的一项,但 List2 始终为空!

我做错了什么?看起来 DbContext 不知何故不同步,依赖注入(inject)如何创建 DbContext/它来自哪里?

编辑:我刚刚做了一些额外的测试,并确认在使用 new 创建的 DbContext 中添加的任何实体仅在 new 中可见,并且在注入(inject)的 DbContext 仅在注入(inject)的 DbContext 内可见,这让我相信它们正在连接到不同的支持数据库,但我无法确认。

最佳答案

我可能是错的,但我的假设是,当您在代码中创建 DbContext 的新实例时,您正在使用无参数构造函数将底层连接字符串设置为某个默认值。但是,DI 注入(inject)的 DbContext 可以使用另一个构造函数来解析,并显式传入不同的连接字符串。

这是显式指定构造函数参数的 Unity 配置示例:

<register type="DbContext, [assembly-name]" mapTo="DbContext, [assembly-name]">
<constructor>
    <param name="nameOrConnectionString" value="Test"/>
</constructor>
</register>

所以我会检查您的容器的配置。

关于asp.net - 填充使用 new 创建的 DbContext(EF7、ASP.NET 5、vnext)后,依赖项注入(inject) DbContext 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28209392/

相关文章:

c# - 三层 Entity Framework 应用程序中的 DTO

asp.net-mvc - ApplicationDbContext 对象引用未设置为对象的实例

c# - 刷新长期 Entity Framework 上下文中的 SQL 连接 Azure AD 访问 token

c# - 没有为 dbcontext 类型定义无参数构造函数

asp.net - 为 ASP.NET 项目创建 setup.msi 打包

ASP.net Entity Framework DropDownList 源查询不返回任何结果

asp.net - 如何让 2 路数据绑定(bind)适用于嵌套的 asp.net Repeater 控件

c# - Entity Framework : One<->Many<->One Mapping?

MySQL int 列映射到 Int64。我怎样才能让它映射到Int32(即int)?

asp.net - 将 asp.net 网站迁移到 linux?