【问题标题】:Is it possible to configure a custom provider for migrate.exe without using the machine.config是否可以在不使用 machine.config 的情况下为 migrate.exe 配置自定义提供程序
【发布时间】:2015-01-07 00:27:54
【问题描述】:

我正在尝试使用 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 文件,但这不起作用并导致以下错误。

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

是否有另一种方法可以在不使用 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>

【问题讨论】:

    标签: .net entity-framework-6 npgsql


    【解决方案1】:

    我刚刚经历了这个(不是专门使用 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>
    

    希望这可以帮助任何不希望自动数据库初始化的人登陆这个问题,如其他答案所示。干杯!

    【讨论】:

    • 感谢您的更新。我今天必须运行迁移并设法让它与 migrate.exe 一起工作。我不想再次指定连接字符串,所以我取出 /ConnectionString 和 /connectionProviderName 选项,它仍然有效。不知道我上次做错了什么,也许我的 migrate.exe 在错误的位置。我正在推广这个答案,因为它可以与 migrate.exe 一起使用。
    • 很高兴听到您能够使用 migrate.exe 让它工作!
    【解决方案2】:

    我找不到其他方法来配置 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多