Entity Framework 6 从哪里获取迁移的连接字符串?

Where Does Entity Framework 6 Get Connection String For Migrations?

我正在使用 EntityFramework 6 代码优先进行迁移。我有两个项目——UI 和 BusinessLogic。 UI 是一个依赖于 BusinessLogic 的 .NET MVC Web 应用程序,它是一个 class 库。 WebUI 具有包含连接字符串的配置部分。 BusinessLogic 还具有以下配置部分(未提供连接字符串)并首先包含实际代码迁移 classes:

<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>

在包管理器控制台中,当我 运行 update-database -ProjectName BusinessLogic 它以某种方式知道使用我的 UI 项目中的连接字符串。

为了理解 how/why 这件事的发生,我将调试器附加到我的 DbContext class 的构造函数,如下所示:

public MyDbContext() : base(CloudConfigurationManager.GetSetting(CONNECTION_STRING_KEY, false))
{
  //--launch the debugger
  System.Diagnostics.Debugger.Launch();

现在启动了调试器并在 DbContext 构造函数中设置了一个断点,我可以计算 AppDomain.CurrentDomain.BaseDirectory 结果:

C:\someRepoLocation\Source\BusinessLogic\bin\Debug\ 这似乎表明当前应用程序域是 BusinessLogic。

然而,评估 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 产量: C:\someRepoLocation\Source\UI\tmpD442.tmp

所以当前的应用程序域是 BusinessLogic,但它正在使用根 UI 文件夹中的一些 .tmp 配置文件?哇?

任何人都可以解释 how/why 在 BusinessLogic(迁移存在的地方)的 app.config 中没有提供连接字符串的情况下,这是有效的吗? 我期待我必须在 BusinessLogic class 库的 app.config 中设置一个连接字符串——但如果这是预期的行为,我很乐意不这样做。期待听到什么解释!

通过我自己的一些测试,我发现 update-database 调用期间使用的配置是当前设置的 start-up 项目。

就我而言,我设置了一个控制台应用程序来执行一些批处理工作,并且在通过种子进行调试时,我注意到了与您指出的相同的行为。交换启动项目是更改活动配置的原因。