gpt4 book ai didi

entity-framework - 如何在运行时从 DbContext 获取表名

转载 作者:行者123 更新时间:2023-12-03 23:39:13 26 4
gpt4 key购买 nike

我试图在运行时从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com