我使用實體框架代碼第一。在實例化從System.Data.Entity.DbContext
派生的上下文時,我希望能夠注入一個System.Data.Common.DbConnection
對象。這樣我就可以通過不同類型的連接,具體取決於代碼運行的環境,即在開發中使用System.Data.SqlClient
(SQL Server),在單元測試和其他生產環境中使用System.Data.SQLite
。的Context
的相關部分看起來是這樣的:EF代碼第一,IoC和DbConnection
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.
我認爲模型初始化過程中發生這種情況時,實體框架顯然認爲它需要新的了它自己的Context
,獨立於IOC模式我正在努力實現。缺少默認的構造函數是由設計決定的。 IDbContextFactory
接口也是沒用的 - 它也必須有一個默認的構造函數。
實體框架代碼首先完全通過從配置文件中讀取連接字符串(或者直接傳遞連接字符串)來設置它的配置,或者可以解決這個問題?
UPDATE,這裏的溫莎配置:
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);
哪些IoC容器您使用的?這種類型的配置是什麼? –
Windsor,'Context'應該最好是PerWebRequest。 – friism
我的意思是,你使用的實際配置是什麼?你如何配置DbConnection傳入? –