我首先使用实体框架代码。我希望能够System.Data.Common.DbConnection
在实例化派生自System.Data.Entity.DbContext
. 这样我就可以根据代码运行的环境传递不同类型的连接,即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 是否完全符合通过从配置文件中读取连接字符串(或者直接传递连接字符串)来设置它的配置的想法,还是可以解决这个问题?
更新,这里是温莎配置:
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);