web-dev-qa-db-ja.com

複数のデータベースEntity Framework 6を​​構成する

私のソリューションには、Entity Framework 6を​​使用する2つのプロジェクトがあります。それぞれが異なるデータベースを指し、両方とも同じデータを使用して-SQL Serverを提供します。私のソリューションの3番目のプロジェクトでは、両方のデータベースを使用する必要があります。私の問題は、これらのコンテキストを構成する方法です。別のアセンブリに構成クラスを作成しようとしました:

namespace OSAD_Base
{
    class EfDbConfiguration : DbConfiguration
    {
        public EfDbConfiguration()
        {
            SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
        }
    }
}

各コンテキストクラスでこの構成を参照します。

namespace IntegrationDb
{
    [DbConfigurationType("OSAD_Base.EfDbConfiguration, OSAD_Base")]
    public partial class IntegrationEntities : DbContext
    {
        public IntegrationEntities(string connectionString)
            : base(connectionString)
        {
        }
    }
}

私の最初を初期化するとき、すべては正しく動作しますが、2番目のコンテキストが初期化されると(順序は関係ありません)、私は取得してエラーになります:

「EfDbConfiguration」のインスタンスが設定されましたが、このタイプは「B1Entities」コンテキストと同じアセンブリで検出されませんでした。 DbConfiguration型をDbContext型と同じアセンブリに配置するか、DbContext型でDbConfigurationTypeAttributeを使用してDbConfiguration型を指定するか、configファイルでDbConfiguration型を設定します。詳細については、 http://go.Microsoft.com/fwlink/?LinkId=26088 を参照してください。*

また、app.config(スタートアッププロジェクトの)でentityframeworkセクションを作成しようとしましたが、次のエラーが発生しました。

構成システムの初期化に失敗しました

認識されない構成セクションentityFramework

同じソリューションで2つの異なるEFプロジェクトを使用するにはどうすればよいですか?

28
Motty

持っているDbContextの数は重要ではありません(エンティティフレームワーク6)。スタートアッププロジェクトのappConfigまたはwebConfigに接続文字列を入力するだけです。

これで準備完了です。

Ef 6.01およびSql Compact 4.0を使用した2つのconnectionStringを持つappConfigの例

<configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="MainDb" connectionString="Data Source=|DataDirectory|\Db.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="AnotherDb" connectionString="Data Source=|DataDirectory|\AnotherDb.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
    </providers>
  </entityFramework>

DbContextsの例:

public class AppDb : DbContext
{
    public AppDb()
        : base("MainDb")
    {

    }
}

public class AnotherDb : DbContext
{
    public AnotherDb()
        : base("AnotherDb")
    {

    }
}

コンテキストが別々のプロジェクトにあるかどうかは重要ではありません。スタートアッププロジェクトの構成のみが重要です。

他に必要な情報があれば教えてください。

がんばろう

25
Yaser Moradi

EntityFramework 6の接続文字列は、実行フォルダーにある(警告!)構成ファイル内にある必要があります。たとえば、OPにはソリューション内に複数のプロジェクトがあるため、接続文字列はメインエグゼクティブプロジェクトに属する構成ファイル内にある必要があります。

コードで接続文字列を定義する場合は、構成ファイルで偽の接続文字列を作成し、エンティティのインスタンスに新しい接続文字列を指定できます。

DBEntities e = new DBEntities();
e.Database.Connection.ConnectionString = "Data Source=MyServ;Initial Catalog=MyDB;Persist Security Info=True;User ID=sa;Password=***;Application Name=MyApp";
10
Rodion

EF6で2つのDBに対して行ったことは次のとおりです。

Web.config

      <connectionStrings>
        <add name="EntityContainer" connectionString="metadata=res://WebService/Database.Database.csdl|res://WebService/Database.Database.ssdl|res://WebService/Database.Database.msl; .../>
        <add name="ArchiveEntityContainer" connectionString="metadata=res://WebService/Database.Database.csdl|res://WebService/Database.Database.ssdl|res://WebService/Database.Database.msl; .../>
      </connectionStrings>

Database.Context.ttに2番目のコンストラクターを追加(注意:自動生成コード)

public <#=code.Escape(container)#>(string connectionString)
    : base(connectionString)
{
}

使用

using (EntityContainer context = new EntityContainer())
{
    //...
}

using (EntityContainer context = new EntityContainer("ArchiveEntityContainer"))
{
    //...
}
0
Flou