エラー 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>