2016-11-08 74 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(); 

然後將您的POCO屬性定義爲Database {get;}

+0

我可以」不要修改存儲層,因爲我希望每個類都有這個值,這將是一個太大的承諾。 – Keith

相關問題