我试图在运行时从 DbContext 获取数据库表名,我发现 posts谈论在 EF 4.x 中不可能获取 SSpace 项(以及表名),默认情况下还没有用于这些操作的公共(public) API。
但我尝试对此进行一些测试,并且我能够在运行时使用调试器从 DbContext 获取表名
此语法由 Visual Studio 生成
((System.Data.Entity.DbContext)(context)).System.Data.Entity.Infrastructure.IObjectContextAdapter.ObjectContext.MetadataWorkspace._itemsSSpace
我做了一些修改以使其在代码中可用,并屈服于此
var objContext = (context as IObjectContextAdapter).ObjectContext;
var metaData = objContext.MetadataWorkspace;
var items = metaData.GetItems(DataSpace.SSpace);
虽然它遵循相同的目标,但 items
抛出异常 The space 'SSpace' has no associated collection.
- 首先:为什么会出现这个错误。
- 第二:有什么办法可以得到这个SSpcae项,或者表名??
最佳答案
这是运行时的一种方式。
public static List<string> GetTableNames()
{
List<string> tableNameList = new List<string>();
// use DBContext to get ObjectContext
DatabaseContext db = new DatabaseContext();
IObjectContextAdapter adapter = db as IObjectContextAdapter;
System.Data.Objects.ObjectContext objectContext = adapter.ObjectContext;
ReadOnlyCollection<EntityType> allTypes = objectContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.CSpace);
foreach (EntityType item in allTypes)
{
// Create full assembly name
string typeName = "original.poco.namespace." + item.Name;
Type type = Type.GetType(typeName);
// wrap into a function
string sql = db.Set(type).ToString();
Regex regex = new Regex(@"FROM \[dbo\]\.\[(?<table>.*)\] AS");
Match match = regex.Match(sql);
tableNameList.Add( match.Groups["table"].Value);
}
return tableNameList;
}
关于entity-framework - 如何在运行时从 DbContext 获取表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275811/