2011-08-10 34 views
3

有沒有一種方法可以獲取用DbModelBuilder定義的表信息?ef代碼優先:獲取沒有dataannotations的實體表名

類似:

entity.GetType().GetTableName() 

最大

編輯:

ID喜歡來實施以下

public static class Helper 
{ 
    public string GetTableName(Type type) { 
    // ?? 
    } 
} 

現在我想用

類型拿到表名
var type = someEntity.getType(); 
var sql = "delete from " + Helper.GetTableName(type) + " where id in (...)" 
+0

你可以添加更多的細節,它很難找出你想要的。 –

+0

希望這有助於http://stackoverflow.com/questions/5313008/how-can-i-extract-the-database-table-and-column-name-for-a-property-on-an-ef4-en/ 6909752#6909752 – RePierre

+0

這不適用於代碼優先:( – maxlego

回答

1

我唯一能想到的解決方案就是反射。這裏是

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // model mappings 

    base.OnModelCreating(modelBuilder); 

    // table mapping 
    var config = modelBuilder.Configurations 
     .GetPrivateFieldValue("_modelConfiguration") 
     .GetPrivateFieldValue("ActiveEntityConfigurations"); 

    var mapping = new Hashtable(); 
    foreach (var c in (IEnumerable)config) 
    { 
     var type = (Type)c.GetPrivateFieldValue("ClrType"); 
     var tableName = (string)c.GetPrivateFieldValue("EntitySetName"); 
     mapping[type] = tableName; 
    } 
    // store mapping whereever needed 
} 

主要想法是在base.OnModelCreating調用後獲取配置對象。