如果它改变了代码的行为,是否添加了一个继承了违反实体原则的类?

时间:2013-04-06 22:23:22

标签: entity-framework-5 ef-migrations solid-principles

我努力使我的代码能够使用不同的连接字符串首先运行代码EF迁移,并最终使其正常工作。

我使用的方法在我对this question

的回答中列出

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

1)采用全局设置来存储连接字符串

2)引入一个类,它的存在导致代码表现不同。

这与我以前的工作方式有很大的不同。这里使用的技术是否违反了坚实的原则?有没有其他方法可以做到不违反原则?

更新: 概述了一种不同的方法 - 可能更为明智[{3}}

1 个答案:

答案 0 :(得分:3)

  

(这一切都与这里的内容有关   How does Database.SetInitializer actually work? (EF code-first create database and apply migrations using several connection strings) - 但是进入完全不同的方向 - 所以我认为分开是有意义的。在此之前阅读)

更新:

这里越来越有趣了。 我确实设法重现了你实际面临的问题。以下是我认为正在发生的事情的简短细分:

首先,这很愉快地工作:

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();
    }
}

(我使用了自定义初始化程序from my other post,它一起控制迁移/创建过程)

没有初始化程序,工作正常。一旦我打开它,我遇到了一些奇怪的问题。

我删除了Db-s(每个连接两个)。我预计要么不工作,要么创建一个数据库,然后在下一个传递中创建另一个数据库(就像它一样,没有迁移,只是'创建'初始化程序)。

  

令我惊讶的是,它实际上是在第一个上创建了两个数据库   传递??

然后,作为一个好奇的人:),我在MyContext ctor上放置断点,并通过迁移器/初始化程序进行调试。再次为空/没有db-s等。

它在我flip的通话中创建了第一个实例。然后在第一次访问'model'时,它调用了初始化程序。迁移者接管了(没有db-s)。在migrator.Update();期间,它实际构建了MyContext(我在配置中通过通用参数猜测) - 并调用'默认'空ctor。默认情况下,它具有“其他连接/名称” - 并且还创建了另一个Db。

所以,我认为这解释了你正在经历的事情。为什么你必须创建'工厂'来支持Context创建。这似乎是唯一的方法。并设置了一些“AppDomain”宽的“连接字符串”(实际上你确实很好地发现了),它没有被空的ctor调用“覆盖”。

我看到的解决方案 - 您只需要通过工厂运行所有内容 - 并在那里'翻转'连接(无需静态连接,只要您的工厂是单件。

  

这对官员来说实际上根本不起作用(我的测试至少)   MigrateDatabaseToLatestVersion初始化程序 - 以及我的原因   用过另一个。