Entity Framework如何得到数据库表的名字

在Entity Framework中,有时我们想要得到真正的数据库表的名称,可以通过Metadata来得到。

直接上代码:

View Code
 1 static void Main(string[] args)
 2         {
 3             using (BreakAwayEntities context = new BreakAwayEntities())
 4             {
 5                 var metadata = context.MetadataWorkspace;
 6                 var tables = metadata.GetItemCollection(DataSpace.SSpace)
 7                     .GetItems<EntityContainer>().Single().BaseEntitySets.OfType<EntitySet>()
 8                     .Where(s => !s.MetadataProperties.Contains("Type")
 9                         || s.MetadataProperties["Type"].ToString() == "Tables");
10 
11                 foreach (var table in tables)
12                 {
13                     var tableName = table.MetadataProperties.Contains("Table") && table.MetadataProperties["Table"].Value != null
14                       ? table.MetadataProperties["Table"].Value.ToString()
15                       : table.Name;
16 
17                     var tableSchema = table.MetadataProperties["Schema"].Value.ToString();
18 
19                     Console.WriteLine(tableSchema + "." + tableName);
20                 }
21                 Console.Read();
22                
23             }
24         }
25     }

首先我们要得到要得到该context的metadata信息,

View Code
1 var metadata = context.MetadataWorkspace;

然后我们要得到SSDL部分类型为EntitySet的那部分信息,

View Code
1 metadata.GetItemCollection(DataSpace.SSpace)
2                     .GetItems<EntityContainer>().Single().BaseEntitySets.OfType<EntitySet>()

我们来看一下这部分信息的组成:

EntitySet部分包含了数据库中表的信息和视图的信息,在这里我们只需要数据库表的信息,所以要做一下过滤:

View Code
1 .Where(s => !s.MetadataProperties.Contains("Type")
2                         || s.MetadataProperties["Type"].ToString() == "Tables");

该方法同样适用于DBContext,只需将

View Code
1 var metadata = context.MetadataWorkspace;

改为

View Code
1 var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace;

 

posted @ 2012-04-25 17:25  Allen Li  阅读(...)  评论(... 编辑 收藏