ADO.NET正在寻找一个我不想使用的DbProvider

时间:2018-03-19 13:30:40

标签: c# postgresql entity-framework ado.net sql-server-ce-3.5

我有一个使用SqlServerCe.3.5和EntityFramework 6的项目。我想将数据库更改为PostgreSQL,所以我更改了配置

自:

<entityFramework>
   <providers>
       <provider invariantName="System.Data.SqlServerCe.3.5" type="System.Data.Entity.SqlServerCompact.Legacy.SqlCeProviderServices, EntityFramework.SqlServerCompact.Legacy" />
   </providers>
   <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
       <parameters>
           <parameter value="System.Data.SqlServerCe.3.5" />
       </parameters>
   </defaultConnectionFactory>
</entityFramework>
<connectionStrings>
    <add name="Model1Container" connectionString="Data Source=<.. DB.sdf ...>" providerName="System.Data.SqlServerCe.3.5" />
</connectionStrings>
<system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SqlServerCe.3.5" />
      <add name="Microsoft SQL Server Compact Data Provider 3.5" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
</system.data>

要:

<entityFramework>
   <providers>
       <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
   </providers>
</entityFramework>
<connectionStrings>
    <add name="Model1Container" connectionString="Server=localhost;<...>" providerName="Npgsql" />
</connectionStrings>
<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>

当我使用新的配置文件运行我的软件时,我收到以下错误:

DbMigrator migrator = new DbMigrator(new Migrations.Configuration());
var latestMigration = migrator.GetLocalMigrations().Last();
var charPos = latestMigration.IndexOf("_");
var migrationName = latestMigration.Substring(charPos + 1, latestMigration.Length - charPos - 1);
migrator.Update(migrationName);  // <<< it crashes here!!

例外:

  

ADO.NET提供程序具有不变名称&#39; System.Data.SqlServerCe.3.5&#39;要么未在计算机或应用程序配置文件中注册,要么无法加载。有关详细信息,请参阅内部异常   在System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Loader.ThrowOnNonWarningErrors()   在System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Loader.LoadItems(IEnumerable&#39; 1 xmlReaders,IEnumerable&#39; 1 sourceFilePaths)   在System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Loader..ctor(IEnumerable&#39; 1 xmlReaders,IEnumerable&#39; 1 sourceFilePaths,Boolean throwOnError,IDbDependencyResolver resolver)      在System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Init(IEnumerable&#39; 1 xmlReaders,IEnumerable&#39; 1文件路径,布尔throwOnError,IDbDependencyResolver解析器,DbProviderManifest&amp; providerManifest,DbProviderFactory&amp; providerFactory,String&amp; providerInvariantName,String&amp; ; providerManifestToken,Memoizer&#39; 2&amp; cachedCTypeFunction)      在System.Data.Entity.Core.Metadata.Edm.StoreItemCollection..ctor(IEnumerable&#39; 1 xmlReaders)      在System.Data.Entity.Utilities.XDocumentExtensions.GetStorageMappingItemCollection(XDocument model,DbProviderInfo&amp; providerInfo)      在System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel,XDocument targetModel,Lazy`1 modificationCommandTreeGenerator,MigrationSqlGenerator migrationSqlGenerator,String sourceModelVersion,String targetModelVersion)      在System.Data.Entity.Migrations.DbMigrator.IsModelOutOfDate(XDocument model,DbMigration lastMigration)      在System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable&#39; 1 pendingMigrations,String targetMigrationId,String lastMigrationId)      在System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable&#39; 1 pendingMigrations,String targetMigrationId,String lastMigrationId)      在System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)      在System.Data.Entity.Migrations.DbMigrator。&lt;&gt; c__DisplayClassc.b__b()      在System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)      在System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)      在System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)      在&lt; ...&gt;

中的DAL.Session.Init()

我收到此错误消息,但我的PostgreSQL数据库是使用我的CodeFirst EntityFramework中定义的所有表创建的。

machine.config中没有SqlServerCe,也没有定义Npgsql。

是否有可能隐藏在某处的设置我看不到?我对所有配置和项目文件进行了文本搜索,但我没有看到任何可能的原因。

1 个答案:

答案 0 :(得分:1)

解! (对于那些任何机会遇到同样问题的人)

我最终彻底删除了迁移,并从头开始重建。我曾使用Enable-Migrations以某种方式链接到当前配置。当我现在启用迁移时,它运行没有任何问题。