在不实例化DbContext的情况下以编程方式检索fluent配置

本文关键字:方式 编程 检索 fluent 配置 情况下 实例化 DbContext | 更新日期: 2023-09-27 18:27:22

我有一个DbContext派生类,其成员实体类是使用Fluent API配置的。我想以编程方式检索这些配置和关系。实现这一点的代码已经到位,我正在将其移植到T4模板中以生成代码。

虽然大多数代码生成都使用反射,但fluent配置需要实例化上下文类才能获得:

  • ObjectContext
  • EntityObjects
  • EntityContainer
  • EntitySet
  • Etcetera

由于我们没有使用属性属性,因此反射没有任何帮助。

这在运行时运行良好,但在T4模板中实例化DbContext会导致各种问题。它有时会崩溃VS,给出奇怪的错误,创建循环依赖关系,等等。

如果我调试T4模板,它运行时不会出错,但后台进程会锁定包含DbContext类和实体的项目。因此,每次实体发生更改时,我都必须重新启动VS三次,执行不同的步骤。哎哟!

我想知道是否有一种方法可以在不实例化上下文类的情况下检索实体元数据/配置。如有任何指导,我们将不胜感激。

在不实例化DbContext的情况下以编程方式检索fluent配置

好吧,你需要加载上下文,因为它需要至少调用OnModelBuilding(DbModelBuilder)一次才能完成它的业务;否则就没有什么可质疑的模式。

如果需要,可以使用EdmxWriter将信息存储为XML;

    public static string ToEdmx(this System.Data.Entity.DbContext context)
    {
        var sb = new StringBuilder();
        using (var textWriter = new StringWriter(sb))
        using (var xmlWriter = System.Xml.XmlWriter.Create(textWriter, new System.Xml.XmlWriterSettings { Indent = true, IndentChars = "    " }))
        {
            System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(context, xmlWriter);
            textWriter.Flush();
        }
        return sb.ToString();
    }

这将为您提供一个带有数据模型的XML文档。您可能可以在一个过程中将其保存到磁盘上,并在TT文件中查询该文件。