16

当我尝试使用代码优先迁移时出现此错误。

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

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; }
}

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

kernel.Bind<IDbContext>()
    .To<VeraContext>()
    .WithConstructorArgument("NameOrConnectionStringName", "VeraDB");

当我尝试使用“Enable-Migrations”添加迁移时抛出错误:

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

如果我从中删除构造函数,VeraContext它将起作用,但会创建另一个VeraData.EF.Infrastructure.VeraContext以其名称为名称的数据库。

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

4

4 回答 4

20

本质上你需要一个默认的ctor(这是错误的)——但仅仅实现它会导致问题。

您必须实施IDbContextFactory以使结果保持一致(或者您从代码的迁移将不起作用等)。

迁移实际上调用您的默认构造函数来建立连接。所以你是其他ctor人并不重要。

这是基本的工厂...

public class MyContextFactory : IDbContextFactory<MyContext>
{
    public MyContext Create()
    {
        return new MyDBContext("YourConnectionName");
    }
}

您应该将其与注入相结合,以根据需要注入和构造您的 DbContext。

于 2013-04-12T17:14:45.927 回答
8

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

public class CustomContext : DbContext
{
    public CustomContext() :base("name=Entities") {} 
}

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

于 2014-01-01T12:20:32.127 回答
2

为了补充@nccsbim071 的答案,我必须再添加一件事......这个选项不喜欢带有默认参数的构造函数......例如:

public MyContext(bool paramABC = false) : base("name=Entities") {...}

相反,您必须创建一个非参数(默认)构造函数和像旧时尚方式一样的参数构造函数。

public MyContext() :base("name=Entities") {...} 
public MyContext(bool paramABC) : this() {...}

笔记:

  • Entities在这种情况下表示连接字符串名称...按照惯例,上下文的名称与连接字符串名称MyContext相同,并且由于与 不同Entities,因此必须手动指定它。
于 2014-02-05T15:47:06.693 回答
0

在我的情况下,我想使用默认连接工厂,而不是明确提供一个。在 EF6 内部的某个地方,它会尝试查找工厂,但它会失败并显示此异常消息。单步执行 EF6 代码,我发现 Glimpse.Ado 正在包装连接工厂,这导致查找无法找到匹配项。

于 2020-08-28T07:17:54.457 回答