Mar*_*cel 5 c# entity-framework-6
我的应用程序在我的DbContext实现中没有无参数构造函数,我不喜欢为实现提供无参数构造函数IDbContextFactory<>.
原因是我想控制DbContext指向的位置.这就是我的所有构造函数都会要求ConnectionStringProvider的原因.
public class MyDbContext : DbContext
{
internal MyDbContext(IConnectionStringProvider provider) : base(provider.ConnectionString) {}
}
Run Code Online (Sandbox Code Playgroud)
和
public class MyContextFactory : IDbContextFactory<MyDbContext>
{
private readonly IConnectionStringProvider _provider;
public MyContextFactory(IConnectionStringProvider provider)
{
_provider = provider;
}
public MyDbContext Create()
{
return new MyDbContext(_provider.ConnectionString);
}
}
Run Code Online (Sandbox Code Playgroud)
我绝对不想添加默认构造函数!我已经这样做了,因为错误的App.config中的错误连接字符串或者假设默认连接字符串(如默认构造函数),它在生产时崩溃了DbContext.我想使用相同的基础设施
IConnectionStringProvider)Add-Migration脚本DbMigrator.GetPendingMigrations()目前我收到了一些消息:
上下文工厂类型'Test.MyContextFactory'没有公共无参数构造函数.添加公共无参数构造函数,在上下文程序集中创建IDbContextFactory实现,或使用DbConfiguration注册上下文工厂.
--- UPDATE ---
这可能与如何将连接字符串注入IDbContextFactory <T>的实例重复?但它没有解决方案.我解释原因:
Add-Migration连接字符串,所以我如何提供DbContext或IDbContextFactory<>消耗它?而不是无参数构造函数?
添加迁移MyMigration -ConnectionStringName"MyConnectionString"
DbMigrator.GetPendingMigrations()也存在同样的问题:我使用的也是无参数DbContext或IDbContextFactory<>实现.据我所知,EntityFramework 通过隐含默认构造函数来违反封装 ,并导致 不是故障安全的时间耦合.所以请提出一个没有无参数构造函数的解决方案.
好吧,我想没有答案!
这就是为什么我想宣布我胃痛的解决方法:由于没有办法摆脱默认构造函数(并满足封装原则),我提供了一个带有故意错误的连接字符串的空构造函数。因此,如果它将用于迁移以外的其他用途,它会在所有环境(调试/集成/发布)中尽早在运行时失败。
public class MyDbContextFactory : IDbContextFactory<MyDbContext>
{
private readonly string _connectionString;
public MyDbContextFactory(string connectionString)
{
_connectionString = connectionString;
}
public MyDbContextFactory()
{
_connectionString = "MIGRATION_ONLY_DONT_USE_ITS_FAKE!";
}
public MyDbContext Create()
{
return new MyDbContext(_connectionString);
}
}
Run Code Online (Sandbox Code Playgroud)
(我不会认为这是一个答案,所以请随意发布更好的解决方案。)
| 归档时间: |
|
| 查看次数: |
1705 次 |
| 最近记录: |