我在Web.config
中有多个连接字符串(对于应该具有完全相同模式的数据库),我的DbContext
会动态初始化连接字符串:
public MyDbContext(string connectionStringName) : base(connectionStringName)
{
}
我没有MyDbContext
的默认构造函数,因为在我的情况下它没有意义。我根据每个实体的Id
值(自定义分片)决定使用哪个连接字符串。
我正在尝试为enable-migrations
运行DbContext
,但我收到以下错误:
The target context 'MyDbContext' is not constructible. Add a default constructor or provide an implementation of IDbContextFactory.
我见过IDbContextFactory
的示例实现,如下所示:
public class MyDbContextFactory : IDbContextFactory<MyDbContext>
{
public MyDbContext Create()
{
return new MyDbContext("connectionStringName");
}
}
这对我有什么帮助?连接字符串是否仍然是硬编码的?如何为每个数据库添加迁移?
答案 0 :(得分:3)
如何为该DbContext提供默认的构造函数,然后在调用脚本add-migration和update-database时,可以使用-ConnectionStringName和-ConnectionProviderName属性指向要使用的数据库。
顺便说一句 - enable-migrations脚本没有做太多 - 它将Migrations文件夹添加到您的项目和Configuration类。你可以自己做。
答案 1 :(得分:0)
最佳选择是使用单独的文件,您将在其中提及针对连接的Id值列表,例如在
中<connectionStrings>
<add name="MyConn1"
connectionString="#your connection string"
/>
<add name="MyConn2"
connectionString="#your connection string"
/>
然后在
<appSettings>
<add key="MyConn1" value="entity1,entity2" />
<add key="MyConn2" value="entity3,entity4" />
</appSettings>
然后在一些全局变量
中动态加载连接字符串public MyDbContext() : base(MyConnectionManager.connectionStringName)
{
}
答案 2 :(得分:0)
你也可以使用IoC。看一下示例代码。
https://github.com/aamir-poswal/CodeSample
特别是
- Bootstrapper.cs
- CRMContext.cs
- 您需要在上下文中自定义的DatabaseFactory.cs