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

时间:2015-01-07 00:27:55

标签: .net entity-framework-6 npgsql

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

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

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

  

错误:ADO.NET提供程序具有不变名称' Npgsql'要么未在计算机或应用程序配置文件中注册,要么无法加载。有关详细信息,请参阅内部异常。

是否有其他方法可以在不使用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>

2 个答案:

答案 0 :(得分:2)

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

.\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>

希望这有助于任何登陆此问题的人不希望自动数据库初始化,如另一个答案中所示。干杯!

答案 1 :(得分:0)

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

最好的解决方案是将数据库初始化程序添加到应用程序实体框架配置中,该配置将自动运行迁移,而不是使用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>