0

エラー 0175: 指定されたストア プロバイダーが構成内に見つからないか、有効ではありません

私は Entity Framework Code-First Migrations を使用しており、すべてがローカルで優れています。

私の DB は SQLServer 2008 です。(ローカル開発に SQL CE も使用しています) ライブ SQL Server db 接続文字列をローカルで問題なく使用できます。

_appStart.cshtml の移行コードは次のとおりです。

@using EF = System.Data.Entity;
@using TCommon = Told.Web.Common.Logic;
@{
    // Manually initialize
    var initializer = new EF.MigrateDatabaseToLatestVersion<TCommon.CommonContext, TCommon.Migrations.Configuration>();
    System.Data.Entity.Database.SetInitializer(initializer);
    initializer.InitializeDatabase(new TCommon.CommonContext());

    // DB Maintenance
    TCommon.AppUserLogic.CleanDatabase();

    // Asp.Net
    WebSecurity.InitializeDatabaseConnection("ToldDB", "UserProfile", "UserId", "Email", true);

    // Common
    TCommon.AppStart.Run();
}

これはローカルでうまく機能します。SQL CE に対して、または私のライブ データベースに対して。ライブデータベースを最新バージョンに移行するために、ローカルで問題なく実行されました。

ただし、Web サーバーに配置すると、次の例外がスローされます。

例外

Server Error in '/' Application.

Schema specified is not valid. Errors: 
(0,0) : error 0175: The specified store provider cannot be found in the configuration, or is not valid.

[MetadataException: Schema specified is not valid. Errors: 
(0,0) : error 0175: The specified store provider cannot be found in the configuration, or is not valid.]
   System.Data.Metadata.Edm.Loader.ThrowOnNonWarningErrors() +8566285
   System.Data.Metadata.Edm.Loader.LoadItems(IEnumerable`1 xmlReaders, IEnumerable`1 sourceFilePaths) +181
   System.Data.Metadata.Edm.StoreItemCollection.Init(IEnumerable`1 xmlReaders, IEnumerable`1 filePaths, Boolean throwOnError, DbProviderManifest& providerManifest, DbProviderFactory& providerFactory, String& providerManifestToken, Memoizer`2& cachedCTypeFunction) +211
   System.Data.Metadata.Edm.StoreItemCollection..ctor(IEnumerable`1 xmlReaders) +295
   System.Data.Entity.Migrations.Extensions.XDocumentExtensions.GetStoreItemCollection(XDocument model, DbProviderInfo& providerInfo) +180
   System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, String connectionString) +48
   System.Data.Entity.Migrations.DbMigrator.IsModelOutOfDate(XDocument model, DbMigration lastMigration) +55
   System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) +269
   System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) +456
   System.Data.Entity.MigrateDatabaseToLatestVersion`2.InitializeDatabase(TContext context) +64

さて、これは移行の試みと関係があります。そのため、移行呼び出しを try-catch ブロックでラップすると、データベースを問題なく使用できます (ライブ データベースをローカルに移行したため)。

@using EF = System.Data.Entity;
@using TCommon = Told.Web.Common.Logic;
@{
    // Manually initialize
    var initializer = new EF.MigrateDatabaseToLatestVersion<TCommon.CommonContext, TCommon.Migrations.Configuration>();
    System.Data.Entity.Database.SetInitializer(initializer);
    try
    {
        initializer.InitializeDatabase(new TCommon.CommonContext());
    }
    catch (Exception ex)
    {
    }

    var db = new TCommon.CommonContext();
    var test = db.AppUsers.FirstOrDefault();

    // DB Maintenance
    TCommon.AppUserLogic.CleanDatabase();

    // Asp.Net
    WebSecurity.InitializeDatabaseConnection("ToldDB", "UserProfile", "UserId", "Email", true);

    // Common
    TCommon.AppStart.Run();
}

Web サーバーで移行 diff-check を実行しようとすると失敗する原因は何ですか?


編集:

Entity Framework の web.config は次のとおりです。

<configuration>
  <configSections>
    ...
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  ...
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
  </entityFramework>
  <system.web>
    <trace enabled="true" requestLimit="40" localOnly="false" pageOutput="true"  />
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </assemblies>
    </compilation>
  </system.web>
  ...
  <connectionStrings>
    <add name="ToldDB" connectionString="..." providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>
4

1 に答える 1

1

答えが見つかりました: Microsoft.SqlServer.Compact および EntityFramework.SqlServerCompact の nuget-packages を必ずインストールしてください。

再度展開し、SQL Server CE が \bin-folder (すべてのファイルを含むフォルダー x86 および amd64) にあることを確認します。また、これらのファイルは bin フォルダーにある必要があります。 System.Data.SqlServerCe.dll System.Data.SqlServerCe.Entity.dll

正しいバージョンであることを確認してください。SQL Ce と共にインストールされたものは機能しませんでした。nuget パッケージのものである必要があります。

また、Web.config に以下が含まれていることを確認してください。

<system.data>
    <DbProviderFactories>
        <remove invariant="System.Data.SqlServerCe.4.0" />
        <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
</system.data>

この:

<dependentAssembly>
    <assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>

本番サーバーで SqlCE を使用する場合でも、これを行う必要があることに注意してください。ただし、データベース自体に bin ファイルが必要かどうかはわかりません。

于 2012-10-18T13:23:23.043 に答える