以编程方式检索流畅配置而不实例化DbContext

时间:2015-12-18 12:38:24

标签: c# .net entity-framework t4

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

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

  • ObjectContext的
  • EntityObjects
  • EntityContainer相关
  • EntitySets
  • 诸如此类

由于我们没有使用属性属性,因此反射无济于事。

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

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

我想知道是否有办法在不实例化上下文类的情况下检索实体元数据/配置。任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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