在不实例化 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 文件中查询该文件。
我有一个派生的 DbContext class,其成员实体 classes 是使用 Fluent API 配置的。我想以编程方式检索这些配置和关系。执行此操作的代码已经到位,我正在将其移植到 T4 模板以进行代码生成。
虽然大部分代码生成都使用反射,但流畅的配置需要实例化上下文 class 才能获得:
- 对象上下文
- 实体对象
- 实体容器
- 实体集
- 等等
由于我们没有使用 属性 属性,反射没有帮助。
这在 运行 时间内工作正常,但在 T4 模板中实例化 DbContext 会导致各种问题。它有时会导致 VS 崩溃,出现奇怪的错误,产生循环依赖等。
如果我调试 T4 模板,它 运行 没有错误,但后台进程锁定了包含 DbContext class 和实体的项目。所以每次实体发生变化时,我都必须重新启动 VS 三次,执行不同的步骤。呸!
我想知道是否有一种方法可以在不实例化上下文 class 的情况下检索实体 metadata/configuration。任何指导将不胜感激。
好吧,您需要加载上下文,因为它需要至少调用一次 OnModelBuilding(DbModelBuilder)
来完成它的业务;否则没有模型可以审问
如果需要,您可以使用 EdmxWriter
;
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 文件中查询该文件。