2014-02-18 51 views
1

我創建使用C#,實體框架4和DB2一些手動更新SQL,在這個簡單的例子的方式...如何從Entity Framework 4.0對象獲取架構名稱?

var UpdateCommand = "UPDATE MY_SCHEMA." + this.Entities.PRODUCT.EntitySet.Name + 
        " SET STOCK=0"; 
var AffectedRows = this.Entities.ExeceuteStoreCommand(UpdateCommand); 

我想指定的模式與實體名稱(後來,如果在可重用的庫方法中實現,則可以作爲參數傳遞)。所以,我試圖...

var Container = this.Entities.MetadataWorkspace.GetEntityContainer(this.Entities.DefaultContainerName, System.Data.Metadata.Edm.DataSpace.CSpace); 
var Set = Container.GetEntitySetByName(this.Entities.PRODUCT.EntitySet.Name, true); 
var SchemaName = Set.MetadataProperties["Schema"].Value; 

問題是,返回的SchemaName始終爲空!

我見過的解決方案基於解析由實體框架生成的SQL,但可能會被愚弄(文本可能包含任何內容)或特定於SQL Server。這個想法是像數據庫一樣不可知的,因爲EF是。

問題是...如何從EF對象中獲取實體模式名稱,而不是解析生成的SQL並且是不可知的?

回答

1

你可以從SSpace得到它。

在ef5下面的作品。也許會在ef4中工作

// for code-first 
var Container = this.Entities.MetadataWorkspace.GetEntityContainer("CodeFirstDatabase", DataSpace.SSpace); 
// db-first 
var Container = this.Entities.MetadataWorkspace.GetEntityContainer("DbFirstModelStoreContainer", DataSpace.SSpace); 

var schemaName = Container.GetEntitySetByName(this.Entities.PRODUCT.EntitySet.Name, true).Schema 
// or 
var set = Container.GetEntitySetByName(this.Entities.PRODUCT.EntitySet.Name, true); 
var schemaName = Set.MetadataProperties["Schema"].Value; 
+0

不適用於EF 4.0。 –

+0

你是先使用代碼還是先使用數據庫? – maxlego

+0

DB首先我相信(EF實體來自從一個存在的數據庫生成/更新的.edmx文件)。注意:只有CSpace數據空間被填充。 –