我正在使用Entity Framework Code First。我想在实例化从System.Data.Entity.DbContext派生的上下文时能够注入一个System.Data.Common.DbConnection对象。这样,我就可以根据代码运行的环境传递不同类型的连接,例如在开发中使用System.Data.SqlClient(SQL Server),在单元测试时使用System.Data.SQLite,以及在生产中使用其他内容。Context的相关部分如下:
这给了我以下错误:
public class Context : DbContext
{
public Context(DbConnection dbConnection)
: base(dbConnection, true)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());
base.OnModelCreating(modelBuilder);
}
public DbSet<Test> Tests { get; set; }
}
这给了我以下错误:
The target context 'Services.Persistence.Context' is not constructible. Add a default constructor or provide an implementation of IDbContextFactory.
我想这发生在模型初始化期间,当Entity Framework显然感到需要新建自己的Context
,独立于我试图实现的IoC模式。缺少默认构造函数是有意设计的。IDbContextFactory
接口同样无用 - 它也必须有一个默认构造函数。
Entity Framework Code First是否完全依赖于从配置文件中读取连接字符串来设置其配置(或者直接传递连接字符串),还是可以绕过此功能?
更新,以下是Windsor配置:
container.Register(Component
.For<DbConnection>()
.UsingFactoryMethod(() =>
new SqlConnection("Data Source=(localdb)\\v11.0;Database=ThatProject;MultipleActiveResultSets=true"))
.LifeStyle.Transient);
container.Register(Component
.For<Context>()
.UsingFactoryMethod(k => new Context(k.Resolve<DbConnection>()))
.LifeStyle.PerWebRequest);
container.Register(Component
.For<IRepository>()
.UsingFactoryMethod(k => new Repository(k.Resolve<Context>()))
.LifeStyle.PerWebRequest);
.config
文件,从未遇到过任何问题。我也使用Windsor。你认为什么使它不切实际? - Diego Mijelshon