无参数DbContext和DbContextFactory构造函数的Add-Migration

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.我想使用相同的基础设施

  • Debug/Relase(只注入不同的IConnectionStringProvider)
  • 调用Add-Migration脚本
  • 运行 DbMigrator.GetPendingMigrations()

目前我收到了一些消息:

上下文工厂类型'Test.MyContextFactory'没有公共无参数构造函数.添加公共无参数构造函数,在上下文程序集中创建IDbContextFactory实现,或使用DbConfiguration注册上下文工厂.

--- UPDATE ---

这可能与如何将连接字符串注入IDbContextFactory <T>的实例重复?但它没有解决方案.我解释原因:

  • 我总是使用Add-Migration连接字符串,所以我如何提供DbContextIDbContextFactory<>消耗它?而不是无参数构造函数?

    添加迁移MyMigration -ConnectionStringName"MyConnectionString"

  • 这里DbMigrator.GetPendingMigrations()也存在同样的问题:我使用的也是无参数DbContextIDbContextFactory<>实现.

据我所知,EntityFramework 通过隐含默认构造函数来违反封装 ,并导致 不是故障安全的时间耦合.所以请提出一个没有无参数构造函数的解决方案.

Mar*_*cel 2

好吧,我想没有答案!

这就是为什么我想宣布我胃痛的解决方法:由于没有办法摆脱默认构造函数(并满足封装原则),我提供了一个带有故意错误的连接字符串的空构造函数。因此,如果它将用于迁移以外的其他用途,它会在所有环境(调试/集成/发布)中尽早在运行时失败。

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)

(我不会认为这是一个答案,所以请随意发布更好的解决方案。)