当我尝试使用代码优先迁移时出现此错误。
我的上下文有一个带有连接名称的构造函数。
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.Infrastruct.VeraContext”不是
可建造的。添加默认构造函数或提供实现
IDbContextFactory 的。
如果我从中删除构造函数VeraContext
它会工作,但会创建另一个数据库VeraData.EF.Infrastructure.VeraContext
正如它的名字一样。
我认为ninject
仅在项目运行时传递连接字符串,而不是在我使用代码优先迁移时传递连接字符串。无论如何,在使用代码优先迁移时我可以注入/提供连接名称的默认值吗?
本质上你需要一个默认的构造函数(这就是错误) - 但仅仅实现它就会导致问题。
你必须实施IDbContextFactory
使结果保持一致(或者从代码迁移将不起作用等)。
迁移实际上调用您的默认构造函数来创建
联系。所以你是另一个人ctor
不会有太大关系。
这是基本工厂...
public class MyContextFactory : IDbContextFactory<MyContext>
{
public MyContext Create()
{
return new MyDBContext("YourConnectionName");
}
}
您应该将其与注入结合起来,根据需要注入并构造您的 DbContext。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)