Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式检索fluent配置而不实例化DbContext_C#_.net_Entity Framework_T4 - Fatal编程技术网

C# 以编程方式检索fluent配置而不实例化DbContext

C# 以编程方式检索fluent配置而不实例化DbContext,c#,.net,entity-framework,t4,C#,.net,Entity Framework,T4,我有一个DbContext派生类,其成员实体类是使用Fluent API配置的。我希望以编程方式检索这些配置和关系。实现这一点的代码已经到位,我正在将其移植到T4模板以生成代码 虽然大多数代码生成使用反射,但fluent configuration要求实例化上下文类,以便获得: 对象上下文 实体对象 实体容器 实体集 等等 因为我们不使用属性属性,所以反射没有任何帮助 这在运行时可以正常工作,但在T4模板中实例化DbContext会导致各种问题。它有时会导致VS崩溃、出现奇怪的错误、创建循环

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

虽然大多数代码生成使用反射,但fluent configuration要求实例化上下文类,以便获得:

  • 对象上下文
  • 实体对象
  • 实体容器
  • 实体集
  • 等等
因为我们不使用属性属性,所以反射没有任何帮助

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

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


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

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

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


这将为您提供一个包含数据模型的XML文档。您可以通过一个过程将其保存到磁盘,然后在TT文件中查询该文件。

谢谢Steve。这是一个很好的建议。我可以将其写入控制台应用程序,称之为数据层项目的后期构建步骤,然后触发T4。虽然我想知道是否有一种方法可以将XML读入某种EF对象模型,而不是直接处理XML?这是一个很棒的答案,谢谢!否则,我会洗脑来解析实际的配置代码,没有Roslyn也会这样P
    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();
    }