在填充使用new创建的DbContext(EF7,ASP.NET 5,vnext)后,Dependancy Injected DbContext为空

时间:2015-01-29 07:45:26

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

我对EF7相对较新,并且听说过将DbContexts的依赖注入到Controller构造函数中是一个很好的方法,可以在给定的Action方法中使用DbContext。但是,在许多情况下,依赖注入是不可能的(例如,在普通类中访问Db),并且必须使用using(VectorDbContext dbContext...)模式。

我遇到了一个问题,即向依赖注入的上下文无法访问使用using模式创建的DbContext添加数据。 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始终为空!

我做错了什么?似乎DbContexts在某种程度上不同步,依赖注入如何创建DbContext /它来自何处?

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

1 个答案:

答案 0 :(得分:2)

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

这是Unity配置的一个示例,它明确指定了构造函数参数:

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

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