获得'语境不是可构建的。添加默认构造函数或提供IDbContextFactory的实现。“
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获得'语境不是可构建的。添加默认构造函数或提供IDbContextFactory的实现。“相关的知识,希望对你有一定的参考价值。
我尝试使用代码首次迁移时收到此错误。
我的上下文有一个带有连接名称的构造函数。
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");
当我尝试使用“启用 - 迁移”添加迁移时会引发错误:
目标上下文'VeraData.EF.Infrastructure.VeraContext'不可构造。添加默认构造函数或提供IDbContextFactory的实现。
如果我从VeraContext
中删除构造函数,它将工作,但创建另一个数据库,其中VeraData.EF.Infrastructure.VeraContext
作为其名称。
我认为ninject
只在项目运行时传递连接字符串,而不是在我使用代码优先迁移时传递。无论如何,我可以在使用代码首次迁移时注入/提供连接名称的默认值?
基本上你需要一个默认的ctor(这是错误) - 但只是实现它会导致问题。
您必须实现IDbContextFactory
才能使结果保持一致(或者您从代码迁移不起作用等)。
迁移实际上会调用默认构造函数来建立连接。所以你是其他
ctor
无关紧要。
这是基本工厂......
public class MyContextFactory : IDbContextFactory<MyContext>
{
public MyContext Create()
{
return new MyDBContext("YourConnectionName");
}
}
你应该将它与注入结合起来,按照你的意愿注入和构建你的DbContext。
如果您不想花时间查看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
为了补充@ nccsbim071的答案,我还要补充一点......这个选项不喜欢带有默认参数的构造函数...例如:
public MyContext(bool paramABC = false) : base("name=Entities") {...}
相反,你必须创建一个非参数(默认)构造函数和参数构造函数,就像旧的时尚方式。
public MyContext() :base("name=Entities") {...}
public MyContext(bool paramABC) : this() {...}
注意:
- 在这种情况下,
Entities
表示连接字符串名称...按照惯例,上下文的名称与连接字符串名称相同,并且因为MyContext
与Entities
不同,所以必须手动指定它。
以上是关于获得'语境不是可构建的。添加默认构造函数或提供IDbContextFactory的实现。“的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins构建Python项目提示:'python' 不是内部或外部命令,也不是可运行的程序