更新:問題は解決しました。この質問の最後を参照してください。
問題:
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);
}
}
編集:エラーの詳細に基づく:構成クラスがどこにあるかをすでに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
私がしたこと:
public partial class MyDataBaseContext : DbContext
{
public MyDataBaseContext (string ConnectionString)
: base(ConnectionString)
{
}
}
Microsoftフォーラムの投稿への投稿 で解決策を見つけました。
基本的に、私には2つのプロジェクトがあり、それぞれに独自のコンテキストがあります。 Entity Frameworkは、(最初の)DbConfigurationクラスの1つだけをロードし、この同じ構成を両方のプロジェクトに使用しようとしました。それがエラーメッセージの理由のようなものです
「 'EfCeConfiguration'のインスタンスが設定されましたが、このタイプは 'DataContext'コンテキストと同じアセンブリで発見されませんでした。」.
したがって、誰かが Microsoftフォーラムの投稿 で提案したように、両方のプロジェクトのDbContextから継承するクラスからすべての[DbConfigurationType(typeof(DbConfigurationClass))]
注釈を削除しましたが、エラーは発生しなくなりました。