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

Retrieving fluent configuration programmatically without instantiating DbContext

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

虽然大部分代码生成都使用反射,但流畅的配置需要实例化上下文 class 才能获得:

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

这在 运行 时间内工作正常,但在 T4 模板中实例化 DbContext 会导致各种问题。它有时会导致 VS 崩溃,出现奇怪的错误,产生循环依赖等。

如果我调试 T4 模板,它 运行 没有错误,但后台进程锁定了包含 DbContext class 和实体的项目。所以每次实体发生变化时,我都必须重新启动 VS 三次,执行不同的步骤。呸!

我想知道是否有一种方法可以在不实例化上下文 class 的情况下检索实体 metadata/configuration。任何指导将不胜感激。

好吧,您需要加载上下文,因为它需要至少调用一次 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 文件中查询该文件。