是否可以在不使用 machine.config 的情况下为 migrate.exe 配置自定义提供程序

Is it possible to configure a custom provider for migrate.exe without using the machine.config

我正在尝试使用 EntityFramework v6 nuget 包中提供的 migrate.exe 设置自动迁移。我的应用程序使用 PostgreSQL 数据库并使用自定义数据库提供程序 (Npgsql),这需要额外配置 EntityFramework.

如果我将所需的配置添加到 machine.config,

Migrate.exe 会成功运行,但这不是一个实用的解决方案,因为它需要在运行迁移的任何地方编辑 machine.config。我还想将其设置为 AppVeyor 构建过程的一部分,我认为不可能编辑 AppVeyor 构建服务器的 machine.config。

作为编辑 machine.config 的替代方法,我尝试创建一个 migrate.exe.config 文件,其中包含 migrate.exe 所需的配置,但这不起作用并导致以下错误.

ERROR: The ADO.NET provider with invariant name 'Npgsql' is either not registered in the machine or application config file, or could not be loaded. See the inner exception for details.

是否有另一种方法可以在不使用 machine.config 的情况下为 migrate.exe 配置自定义提供程序?

作为参考,所需的额外配置是

<system.data>
  <DbProviderFactories>
    <remove invariant="Npgsql" />
    <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
  </DbProviderFactories>
</system.data>
<entityFramework>
  <defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, Npgsql" />
  <providers>
    <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
  </providers>
</entityFramework>

我找不到另一种方法来配置 migrate.exe 以使用自定义提供程序。

最终更好的解决方案是在应用程序 entity framework 配置中添加一个数据库初始化器,它将 运行 自动迁移,而不是使用 migrate.exe.

<entityFramework>
  <contexts>
    <context type="Assembly.ApplicationDbContext, Assembly">
      <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Assembly.ApplicationDbContext, Assembly], [Assembly.Migrations.Configuration, Assembly]], EntityFramework" />
    </context>
  </contexts>
</entityFramework>

我刚刚经历了这个(不是专门针对 AppVeyor,但我正在努力实现我的 TeamCity 构建服务器的自动化)并且能够使用 Entity Framework 6.0.0.0 让它工作。这是我 was 运行 导致相同错误的命令

.\migrate.exe
  MyProject.DataContracts.dll
  /ConnectionString:"server=localhost;user id=<myuserid>;password=<mypassword>;database=<mydatabase>"
  /connectionProviderName:Npgsql

缺少的组件正在为我的启动项目指定配置文件,就像这样

.\migrate.exe
  MyProject.DataContracts.dll
  /startupConfigurationFile:"..\..\..\MyStartupProject\Web.config"
  /ConnectionString:"server=localhost;user id=<myuserid>;password=<mypassword>;database=<mydatabase>"
  /connectionProviderName:Npgsql

作为参考,这里是我的 Web.config

中的相关 Npgsql 部分
<system.data>
  <DbProviderFactories>
    <remove invariant="Npgsql" />
    <add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
  </DbProviderFactories>
</system.data>

<entityFramework>
  <defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, Npgsql.EntityFramework" />
  <providers>
    <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework"/>
  </providers>
</entityFramework>

希望这可以帮助那些不想自动初始化数据库的人解决这个问题,如其他答案所示。干杯!