2016-11-08 6 views
1

POCOエンティティクラスに読み取り専用プロパティ[NotMapped]Database {get;}を作成して、作成時にエンティティがロードされたデータベースの名前を反映させて、後でDbContextインスタンスが利用できないときに値を返します。オブジェクトの作成時にこのデータをロードするようにEFに指示するにはどうすればよいですか?エンティティクラスにデータベース名を格納する方法

私は約context.Database.Connection.ConnectionStringを知っていますが、それは私がしたいことではありません。オブジェクトがDbContextクラスを介してインスタンス化されているときに、プロパティを現在のデータベース名に設定する必要があります。

私はこの問題を検索しましたが、ここで提供する情報を見つけることができませんでした。おそらく質問のフレーズ方法がわかりません。

答えて

2

このようにすることができます。まず、インタフェースを作成します。

public interface IHasDatabaseName { 
    string Database { set; } 
} 

問題のエンティティを実装します。その後のコンストラクタでごDbContextを(または任意の場所で、あなたは、あなたのDbContextを構築しますが、例えば、DIコンテナを使用している場合)、ObjectMaterializedイベントをサブスクライブ:その後、

// this is DbContext here 
((IObjectContextAdapter) this).ObjectContext.ObjectMaterialized += ObjectContextOnObjectMaterialized; 

そして:

// this is DbContext here 
private void ObjectContextOnObjectMaterialized(object sender, ObjectMaterializedEventArgs objectMaterializedEventArgs) { 
    var dbName = objectMaterializedEventArgs.Entity as IHasDatabaseName; 
    if (dbName != null) { 
     dbName.Database = this.Database.Connection.Database; 
    } 
} 
0

私はテーブルに計算された列を作成してその情報を取得する必要があると思います。ような何か:

alter table YourTable add [Database] AS DB_NAME(); 

その後Database {get;}としてあなたPOCOのプロパティを定義します。

+0

私ができます」ストレージレイヤーを変更する必要があります。また、すべてのクラスでこの値を使用したいので、それは大規模な作業です。 – Keith

関連する問題