2011-07-06 71 views

回答

8

如另一個答案所述,可以使用本IObjectContextAdapter

private string GetTableName(DbEntityEntry ent) 
     { 
      ObjectContext objectContext = ((IObjectContextAdapter) this).ObjectContext; 
      Type entityType = ent.Entity.GetType(); 

      if (entityType.BaseType != null && entityType.Namespace == "System.Data.Entity.DynamicProxies") 
       entityType = entityType.BaseType; 

      string entityTypeName = entityType.Name; 

      EntityContainer container = 
       objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace); 
      string entitySetName = (from meta in container.BaseEntitySets 
            where meta.ElementType.Name == entityTypeName 
            select meta.Name).First(); 
      return entitySetName; 
     } 

上面的代碼還測試對於代理來獲得表名。希望這可以幫助到達這個鏈接的其他人,因爲我認爲很久以前原始海報就解決了這個問題。

+0

這隻得到實體名稱而不是表名,只是FYI。 –

+0

@PhilSandler你是對的,我怎樣才能得到表名? – tkt986

+0

看到這裏如何獲得表名http://romiller.com/2014/04/08/ef6-1-mapping-between-types-tables/ (假設EF 6.1) – Quails4Eva

0

實際上,您可以從DbContext獲得ObjectContext(通過將其轉換爲IObjectContextAdapter)並使用您見過的示例。

0

msdn你可以找到的文檔的DbContext,那裏你可以看到,它明確地實現IObjectContextAdapter,投下您的DbContext,獲得語境IObjectContextAdapter和使用ObjectContext的財產。

+2

我如何獲得實體名稱? –

5

我發現了一個更清潔的方式在msdn擺脫代理的名字。

private string GetTableName(DbEntityEntry ent) 
{ 
    return ObjectContext.GetObjectType(entry.Entity.GetType()).Name; 
}