是增加从继承的东西侵犯了坚实的原则,如果它改变了代码的行为一类?(Is adding a class

2019-08-20 01:55发布

我努力让我的代码使用不同的连接字符串来运行代码第一EF迁移,终于拿到了它的工作。

我用的方法,我的回答是概述了这个问题

让我困扰的是,为了能够使用不同的连接字符串我必须运行同一代码

1)度假村的全局设置存储连接字符串

2)引入一类,其非常存在而产生的代码,以表现不同。

这是我习惯的工作方式完全不同。 这里使用违反了固体原理的技术? 是否有这样做的任何其他方式不违反原则呢?

UPDATE:一种不同的方法-可能是更明智的概述这里

Answer 1:

(这一切都关系到什么在这里如何Database.SetInitializer实际工作(EF代码首先创建数据库,并使用多个连接字符串申请迁移)? -但进入完全不同的方向-让我觉得很有道理是分开。在此之前阅读有)

更新:

在此变得有趣。 我还是设法重现你面对真正的问题 。 这里是什么,我认为它的发生短暂故障:

首先,这个工作“愉快”:

Database.SetInitializer(new CreateAndMigrateDatabaseInitializer<MyContext, MyProject.Migrations.Configuration>());
for (var flip = false; true; flip = !flip)
{
    using (var db = new MyContext(flip ? "Name=MyContext" : "Name=OtherContext"))
    {
        // insert some records...
        db.SaveChanges();
    }
}

(I使用的自定义初始化从我的其他交 ,它控制迁移/创建过程一起)

这W / O一个初始化工作的罚款。 一旦我切换上,我遇到了一些奇怪的问题。

我删除的DB-S(二,为每个连接)。 我希望无论是不行的,还是应在下一行程制作一个分贝,那么另一个(就像它,W / O迁移,只是“创建”初始化)。

发生了什么事,让我吃惊的 - 它实际上是建立在第一轮两个数据库?

然后,是一个充满好奇心的人:),我把断点MyContext构造函数,并通过迁移/初始调试。 再次空/无分贝-S等。

它创建于内我的电话一审flip 。 然后在第一次访问“模式”,它调用初始化。 迁移接手(已经没有DB-S)。 在migrator.Update(); 它实际上构建MyContext (我通过在配置通用PARAM猜测) -并调用“默认”空构造函数。 在默认情况下有“其他连接/名称” - 并创建其他数据库都管不好。

所以,我觉得这个解释您遇到什么。 为什么你必须创建“工厂”,以支持上下文的创建。 这似乎是唯一的出路。 并设置一些“AppDomain的”宽“连接字符串”(你没发现以及实际上)用一个空构造函数调用,它不是“重写”。

解决方案,我看到的是 -你只需要运行通过工厂的一切-在有“翻转”的连接(无需静态连接,只要你的工厂是一个单。

这实际上并没有在所有(我的测试至少)有正式工作MigrateDatabaseToLatestVersion ,为什么我用另外一个原因-初始化。



文章来源: Is adding a class that inherits from something a violation of the solid principles if it changes the behavior of code?