获得'语境不是可构建的.添加默认构造函数或提供IDbContextFactory的实现."

Las*_*eak 14 ninject ef-code-first asp.net-mvc-4 ef-migrations entity-framework-5

我尝试使用代码首次迁移时收到此错误.

我的上下文有一个带有连接名称的构造函数.

public class VeraContext : DbContext, IDbContext
{
    public VeraContext(string NameOrConnectionStringName = "VeraDB")
        : base(NameOrConnectionStringName)
    {
    }

    public IDbSet<User> Users { get; set; }
    public IDbSet<Product> Products { get; set; }
    public IDbSet<IntCat> IntCats { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当项目运行时,此连接名称将使用ninject注入,我也将其指定为默认值,如上面的代码中所示但这没有帮助.

kernel.Bind<IDbContext>()
    .To<VeraContext>()
    .WithConstructorArgument("NameOrConnectionStringName", "VeraDB");
Run Code Online (Sandbox Code Playgroud)

当我尝试使用"启用 - 迁移"添加迁移时会引发错误:

目标上下文'VeraData.EF.Infrastructure.VeraContext'不可构造.添加默认构造函数或提供IDbContextFactory的实现.

如果我从中删除构造函数VeraContext将工作,但创建另一个数据库VeraData.EF.Infrastructure.VeraContext作为其名称.

我假设ninject只在项目运行时传递连接字符串,而不是在我使用代码优先迁移时.无论如何,我可以在使用代码首次迁移时注入/提供连接名称的默认值?

NSG*_*aga 20

基本上你需要一个默认的ctor(这是错误) - 但只是实现它会导致问题.

您必须实现IDbContextFactory结果才能保持一致(或者您从代码迁移不起作用等).

迁移实际上会调用默认构造函数来建立连接.所以你是别的ctor并不重要.

这是基本工厂......

public class MyContextFactory : IDbContextFactory<MyContext>
{
    public MyContext Create()
    {
        return new MyDBContext("YourConnectionName");
    }
}
Run Code Online (Sandbox Code Playgroud)

你应该将它与注入结合起来,按照你的意愿注入和构建你的DbContext.


ncc*_*071 7

如果您不想花时间查看IDbContextFactory选项,并且为了使事情正常工作,请在调用基本DbContext时创建默认构造函数并对连接字符串的名称进行硬编码:

public class CustomContext : DbContext
{
    public CustomContext() :base("name=Entities") {} 
}
Run Code Online (Sandbox Code Playgroud)

SRC:http://www.appetere.com/Blogs/SteveM/April-2012/Entity-Framework-Code-First-Migrations

  • 使用Ninject(或任何IoC)不是为了使连接字符串名称可以独立于实际DbContext进行配置的全部目的吗?那么为什么要这样硬编码连接字符串名称呢?`Enable-Migrations`提供了一个命令行选项来提供命令的连接字符串名称。我的问题是,在构造它们时如何将连接字符串名称注入到DbContext类中。好像这也是OP所追求的。 (2认同)