27

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

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

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

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

モデルへの変更を元に戻し、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 と同じです。

編集:

プロジェクトからEF 5パッケージを完全にアンインストールして削除し、再インストールすることさえ試みました。同じ問題 >:(

4

7 に答える 7

64

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

于 2013-03-21T17:44:15.960 に答える
3

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

Get-Help enable-migrations -detailed

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

この方法では、混乱を招く可能性がある既定の接続文字列に依存しません。

于 2014-04-03T09:51:15.723 に答える
1

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

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

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

于 2013-03-21T16:54:41.510 に答える
1

これは、私のクライアントが抱えていた問題のように不気味に聞こえます。これは、machine.config の DbProviders セクションをいじった何かと関係がありました。彼はここに詳細を掲載しました: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/f2a19487-6d38-4a79-a809-d3efe4c9d9fe (これは、上司の質問に対する Adam Scholz の回答です。: ) )

ジュリー

于 2013-03-21T17:22:29.550 に答える
0

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

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

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

于 2014-08-26T09:36:20.187 に答える
0

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

SQL Server 2012 を使用する Entity Framework 6 で System.Data.Entity.Core.ProviderIncompatibleException system-data-entity-core-providerin が発生する

于 2014-08-14T21:57:27.107 に答える