3つのプロジェクトがあります。
2つのWebサイトプロジェクトはCompany.Domain
を参照しています。
EF 5 DbContext
はCompany.Domain.Data.EntityFramework
にあり、次のようになります。
using System.Data.Entity;
using Company.Domain.Data.EntityFramework.Entities;
namespace Company.Domain.Data.EntityFramework.
{
public class CompanyEntities : DbContext
{
public DbSet<Notification> Notifications { get; set; }
public DbSet<Report> Reports { get; set; }
public DbSet<ReportSection> ReportSections { get; set; }
public DbSet<ReportPage> ReportPages { get; set; }
// brevity brevity
}
}
過去に移行を有効にしてツールを正常に使用したことがあるため、現在問題が発生している理由がわかりません。移行構成はCompany.Domain.Data.EntityFramework.Migrations
にあり、次のようになります。
namespace Company.Domain.Data.EntityFramework.Migrations
{
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using Company.Domain.Data.EntityFramework;
public class Configuration : DbMigrationsConfiguration<CompanyEntities>
{
public Configuration()
{
MigrationsDirectory = @"Data\EntityFramework\Migrations";
AutomaticMigrationsEnabled = false;
}
protected override void Seed(CompanyEntities context)
{
// empty at the moment
}
}
}
次に、App.config
プロジェクトのルートにCompany.Domain
ファイルがあり、次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
</configSections>
<connectionStrings>
<add name="CompanyEntities" providerName="System.Data.SqlClient" connectionString="Data Source=devsql;Initial Catalog=CompanyEntities;uid=XXXXX;pwd=XXXXX;MultipleActiveResultSets=True;" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
私たちのデータベースは、ネットワーク上の別のサーバー上にあります。 SQL Server Management Studioで接続でき、アプリケーションは実行時に問題なく接続できます。ただし、add-migration
またはupdate-database
を実行しようとすると、次のエラーが発生します。
System.Data.ProviderIncompatibleException:データベースからプロバイダー情報を取得中にエラーが発生しました。これは、EntityFrameworkが誤った接続文字列を使用していることが原因である可能性があります。詳細については内部例外をチェックし、接続文字列が正しいことを確認してください。 ---> System.Data.ProviderIncompatibleException:プロバイダーがProviderManifestToken文字列を返しませんでした。 ---> System.Data.SqlClient.SqlException:SQLServerへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、およびSQLServerがリモート接続を許可するように構成されていることを確認してください。
モデルへの変更を元に戻し、update-database
を実行して、「データベースは最新の移行中です」と表示されるかどうかを確認しましたが、それでも上記のエラーが発生しました。 App.config
の接続文字列を何度も繰り返してきました。移行が接続されない理由はわかりませんが、両方のWebサイトプロジェクトは実行時に問題なく機能します。移行は過去に機能しました。以下は、データベースの__MigrationHistory
テーブルにあるものと比較したソリューションエクスプローラーでの移行です。
update-database
を実行して、最新であることを通知する必要があるようですが、代わりにそのエラーが発生します。
私が理解しているように、移行コマンドを実行しているとき、移行は2つのWebサイトプロジェクトに注意を払うべきではありませんが、念のためにWeb.configファイルにも注いでいます。接続文字列はApp.configと同じです。
プロジェクトからEF5パッケージを完全にアンインストールして削除し、再インストールしてみました。同じ問題> :(
EFが接続文字列のソースとして開始プロジェクトを使用するため、開始プロジェクトにweb.configまたはapp.configが含まれていましたか
OK、それで最初はうまくいきませんでした:(
次に、一杯のコーヒーとそれにStartUPProjectNameを追加した後、それは完了しました!試してください:
Update-Database -StartUpProjectName MYPROJECT.NAME -Script
Web.config /app.configが存在するスタートアッププロジェクトを指すようにしてください
パッケージマネージャーコンソールで移行を有効にするためのヘルプが表示された場合
Get-Help enable-migrations -detailed
-StartupProjectNameオプションについては、次のドキュメントを参照してください。
-StartUpProjectName
Specifies the configuration file to use for named connection strings. If omitted, the specified project's configuration file is used.
ドキュメントは少し紛らわしいですが、このオプションを使用してプロジェクト名を指定すると、移行は指定されたプロジェクトの構成ファイルで接続文字列を検索することを意味します。 (構成ファイルはweb.config
またはapp.config
にすることができます)。
Webアプリを作成している場合、接続文字列はおそらくそのweb.config
にあるため、Webアプリプロジェクトを指定する必要があります。他の種類のプロジェクトの場合、接続文字列はクラスライブラリなどのapp.config
ファイルに含まれるため、そのプロジェクトを指定する必要があります。
さらに、接続文字列の名前を指定するDbContext
クラスのコンストラクターを使用することをお勧めします。
public class CompanyEntities : DbContext
{
public CompanyEntities()
:base("ConnectionStringName")
{
...
}
....
}
このようにして、混乱を招く可能性のあるデフォルトの接続文字列に依存しません。
これは私のクライアントが抱えていた問題のように不気味に聞こえます。それはmachine.configのDbProvidersセクションを台無しにした何かと関係がありました。彼はここに詳細を入れました: http://social.msdn.Microsoft.com/Forums/en-US/adodotnetentityframework/thread/f2a19487-6d38-4a79-a809-d3efe4c9d9fe (それはアダムショルツの答えです上司の質問に。:))
ジュリー
SQL Management Studio経由で接続できるとおっしゃっていますが、接続文字列で指定されたuid=XXXXX;pwd=XXXXX;
ではなく、Windows認証を使用していると思います。
そのユーザーIDとパスワードを使用してManagementStudioを接続してみてください。
また、そのアカウントはロックアウトされている可能性があります(Active Directoryアカウントの場合)。
これはすでに解決されているかもしれませんが、ソリューションのスタートアッププロジェクトをエンティティdllプロジェクト(app.configファイルがある)に設定することで解決しました。パッケージマネージャーコンソールウィンドウの「デフォルトプロジェクト」を正しいエンティティdllプロジェクトに設定しましたが、機能しませんでした。詳細については
SQL Server2012を使用するEntityFramework 6はSystem.Data.Entity.Core.ProviderIncompatibleExceptionを提供します system-data-entity-core-providerin
ソリューションに複数のプロジェクトがある場合は、ソリューションのスタートアッププロジェクトを、EFの設定を含むWeb.ConfigまたはApp.Configファイルを含むプロジェクトに設定してみてください。
モデル用のWebプロジェクトと個別のプロジェクト(Data.Models)を使用したソリューションがありました。ソリューションにコンソールアプリケーションを追加するまでは、すべて順調でした。それをスタートアッププロジェクトに設定するとすぐに、EF移行は失敗します。
また、ソリューション内の複数のプロジェクトで移行が有効になっている場合は、追加移行を実行した後、必ず各プロジェクトでUpdate-Databaseを実行してください。私のWebプロジェクトには保留中の移行があり、最初のプロジェクトで保留中の移行があったため、2番目のプロジェクトで移行が奇妙に失敗しました。