web-dev-qa-db-ja.com

EF 5移行は、実行時に問題なく機能していても、データベースに接続できません

3つのプロジェクトがあります。

  • Company.Domain(クラスライブラリ)
  • Company.PublicWebsite(MVC3 Webアプリケーション)
  • Company.InternalWebsite(MVC3 Webアプリケーション)

2つのWebサイトプロジェクトはCompany.Domainを参照しています。

EF 5 DbContextCompany.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を実行しようとすると、次のエラーが発生します。

http://content.screencast.com/users/Chevex/folders/Snagit/media/80fbfd6a-4956-407f-b88f-d5a53a9e5feb/03.21.2013-10.25.png

System.Data.ProviderIncompatibleException:データベースからプロバイダー情報を取得中にエラーが発生しました。これは、EntityFrameworkが誤った接続文字列を使用していることが原因である可能性があります。詳細については内部例外をチェックし、接続文字列が正しいことを確認してください。 ---> System.Data.ProviderIncompatibleException:プロバイダーがProviderManifestToken文字列を返しませんでした。 ---> System.Data.SqlClient.SqlException:SQLServerへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、およびSQLServerがリモート接続を許可するように構成されていることを確認してください。

モデルへの変更を元に戻し、update-databaseを実行して、「データベースは最新の移行中です」と表示されるかどうかを確認しましたが、それでも上記のエラーが発生しました。 App.configの接続文字列を何度も繰り返してきました。移行が接続されない理由はわかりませんが、両方のWebサイトプロジェクトは実行時に問題なく機能します。移行は過去に機能しました。以下は、データベースの__MigrationHistoryテーブルにあるものと比較したソリューションエクスプローラーでの移行です。

http://content.screencast.com/users/Chevex/folders/Snagit/media/7abeaa46-ff0f-4817-a0d7-1adb086e8f0c/03.21.2013-10.30.png

http://content.screencast.com/users/Chevex/folders/Snagit/media/3c6ac54d-f63d-417f-9253-39b6a8fea85d/03.21.2013-10.32.png

update-databaseを実行して、最新であることを通知する必要があるようですが、代わりにそのエラーが発生します。

私が理解しているように、移行コマンドを実行しているとき、移行は2つのWebサイトプロジェクトに注意を払うべきではありませんが、念のためにWeb.configファイルにも注いでいます。接続文字列はApp.configと同じです。

編集:

プロジェクトからEF5パッケージを完全にアンインストールして削除し、再インストールしてみました。同じ問題> :(

29
Chev

EFが接続文字列のソースとして開始プロジェクトを使用するため、開始プロジェクトにweb.configまたはapp.configが含まれていましたか

62
Bhugot

OK、それで最初はうまくいきませんでした:(

次に、一杯のコーヒーとそれにStartUPProjectNameを追加した後、それは完了しました!試してください:

Update-Database -StartUpProjectName MYPROJECT.NAME -Script

Web.config /app.configが存在するスタートアッププロジェクトを指すようにしてください

4
AhmedGadir

パッケージマネージャーコンソールで移行を有効にするためのヘルプが表示された場合

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")
    {
         ...
    }
....
}

このようにして、混乱を招く可能性のあるデフォルトの接続文字列に依存しません。

3
JotaBe

これは私のクライアントが抱えていた問題のように不気味に聞こえます。それはmachine.configのDbProvidersセクションを台無しにした何かと関係がありました。彼はここに詳細を入れました: http://social.msdn.Microsoft.com/Forums/en-US/adodotnetentityframework/thread/f2a19487-6d38-4a79-a809-d3efe4c9d9fe (それはアダムショルツの答えです上司の質問に。:))

ジュリー

1
Julie Lerman

SQL Management Studio経由で接続できるとおっしゃっていますが、接続文字列で指定されたuid=XXXXX;pwd=XXXXX;ではなく、Windows認証を使用していると思います。

そのユーザーIDとパスワードを使用してManagementStudioを接続してみてください。

また、そのアカウントはロックアウトされている可能性があります(Active Directoryアカウントの場合)。

1
jp2code

これはすでに解決されているかもしれませんが、ソリューションのスタートアッププロジェクトをエンティティdllプロジェクト(app.configファイルがある)に設定することで解決しました。パッケージマネージャーコンソールウィンドウの「デフォルトプロジェクト」を正しいエンティティdllプロジェクトに設定しましたが、機能しませんでした。詳細については

SQL Server2012を使用するEntityFramework 6はSystem.Data.Entity.Core.ProviderIncompatibleExceptionを提供します system-data-entity-core-providerin

0
ATHER

ソリューションに複数のプロジェクトがある場合は、ソリューションのスタートアッププロジェクトを、EFの設定を含むWeb.ConfigまたはApp.Configファイルを含むプロジェクトに設定してみてください。

モデル用のWebプロジェクトと個別のプロジェクト(Data.Models)を使用したソリューションがありました。ソリューションにコンソールアプリケーションを追加するまでは、すべて順調でした。それをスタートアッププロジェクトに設定するとすぐに、EF移行は失敗します。

また、ソリューション内の複数のプロジェクトで移行が有効になっている場合は、追加移行を実行した後、必ず各プロジェクトでUpdate-Databaseを実行してください。私のWebプロジェクトには保留中の移行があり、最初のプロジェクトで保留中の移行があったため、2番目のプロジェクトで移行が奇妙に失敗しました。

0
Dave Thompson