web-dev-qa-db-ja.com

EF6と複数の構成(SQL ServerおよびSQL Server Compact)

更新:問題は解決しました。この質問の最後を参照してください。

問題

SQL ServerとSQL Server CEの両方を同じAppDomainで使用しているシナリオでは、Entity Framework 6とコードベースの構成を使用しようとしています。

この非常に単純なシナリオは、「設計上」サポートされていないようです。 EFチームから:

注:同じAppDomainで複数の構成クラスを使用することはサポートされていません。この属性を使用して2つのコンテキストに異なる構成クラスを設定すると、例外がスローされます。

詳細はこちら: コードベースの構成(Codeplex)

質問

ここからどうやって前進しますか?どんな助けでも大歓迎です!設定をAppDomainではなくコンテキストに接続するより柔軟な方法はありますか?

(コンテキストクラスは別のアセンブリにあります。DbConfigurationType属性を試しましたが、問題はEF自体です)

設定ファイル:

通常のSQLサーバーの構成

public class EfConfiguration : DbConfiguration
{
    public EfConfiguration()
    {
        SetProviderServices(
            SqlProviderServices.ProviderInvariantName, 
            SqlProviderServices.Instance);

        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

SQL Server Compact Editionの構成

public class EfCeConfiguration : DbConfiguration
{
    public EfCeConfiguration()
    {
        SetProviderServices(
            SqlCeProviderServices.ProviderInvariantName,
            SqlCeProviderServices.Instance);

        SetDefaultConnectionFactory(
            new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName));
    }
}

UPDATE:

私たちが得るエラーは:

System.TypeInitializationException: 'MyProject.Repositories.Base.DataContext'のタイプ初期化子が例外をスローしました。 ----> System.InvalidOperationException: 'EfCeConfiguration'のインスタンスが設定されましたが、このタイプは 'DataContext'コンテキストと同じアセンブリで検出されませんでした。 DbConfigurationタイプをDbContextタイプと同じアセンブリに配置するか、DbContextタイプでDbConfigurationTypeAttributeを使用してDbConfigurationタイプを指定するか、構成ファイルでDbConfigurationタイプを設定します。詳細については、 http://go.Microsoft.com/fwlink/?LinkId=26088 を参照してください。

UPDATE 2、ソリューション上記のように、構成は1つだけです。 SqlとSqlCeは異なるプロバイダーを使用するため、これは問題です。 「SetDefaultConnectionFactory」を使用して1つのタイプのデータベースに適合させると、もう1つは失敗します。

代わりに、以下の回答としてマークされた投稿で説明されているように、コンテキストに接続を提供します。接続文字列ではなく、常に接続でコンテキストを初期化したら、問題ありません。構成からSetDefaultConnectionFactory呼び出しを削除できます。 SqlCeコンテキストの構成には以下のコードのみを使用し、Sqlコンテキストの構成は使用していません。

  public class CommonEfConfiguration : DbConfiguration
    {
        public CommonEfConfiguration()
        {
            // EF does not know if the ce provider by default,
            // therefore it is required to be informed about it.
            // The connection factories are not necessary since the connection
            // is always created in the UnitOfWork classes
            SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance);
        }
    }
23
Henrik Carlsson

編集:エラーの詳細に基づく:構成クラスがどこにあるかをすでにEFに伝えようとしましたか?

[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssemblyFullyQualifiedName")]
public class MyContextContext : DbContext
{
}

それが機能しない場合は、代替案を参照してください

コンストラクターDbConnectionでコンテキストを使用する

public class MYDbContext : DbContext {
     // MIgration parameterless constructor is managed in  MyMigrationsContextFactory 

    public MyDbContext(string connectionName) : base(connectionName) { } // no this

    public MYDbContext(DbConnection dbConnection, bool contextOwnsConnection)  // THIS ONE
        : base(dbConnection, contextOwnsConnection) {  }

次に、プロバイダーごとに「DBConnection」接続が必要です。 SQLサーバーの場合

      public DbConnection GetSqlConn4DbName(string dataSource, string dbName) {
        var sqlConnStringBuilder = new SqlConnectionStringBuilder();
        sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;
        sqlConnStringBuilder.IntegratedSecurity = true;
        sqlConnStringBuilder.MultipleActiveResultSets = true;

        var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);
        var sqlConn = sqlConnFact.CreateConnection(dbName);
        return sqlConn;
    }

sqlCeファクトリーについて繰り返し、DBConnectionを生成することもできます SqlCe接続係数create connection

13
phil soady

私がしたこと:

public partial class MyDataBaseContext : DbContext
{
    public MyDataBaseContext (string ConnectionString)
        : base(ConnectionString)
    {
    }
}
2
havalli

Microsoftフォーラムの投稿への投稿 で解決策を見つけました。

基本的に、私には2つのプロジェクトがあり、それぞれに独自のコンテキストがあります。 Entity Frameworkは、(最初​​の)DbConfigurationクラスの1つだけをロードし、この同じ構成を両方のプロジェクトに使用しようとしました。それがエラーメッセージの理由のようなものです

「 'EfCeConfiguration'のインスタンスが設定されましたが、このタイプは 'DataContext'コンテキストと同じアセンブリで発見されませんでした。」.

したがって、誰かが Microsoftフォーラムの投稿 で提案したように、両方のプロジェクトのDbContextから継承するクラスからすべての[DbConfigurationType(typeof(DbConfigurationClass))]注釈を削除しましたが、エラーは発生しなくなりました。

0
Ulysses Alves