我有一个DbContext派生类,其成员实体类是使用Fluent API配置的。我想以编程方式检索这些配置和关系。执行此操作的代码已经到位,我将其移植到T4模板以生成代码。
虽然大多数代码生成都使用反射,但是流畅的配置需要实例化上下文类才能获得:
由于我们没有使用属性属性,因此反射无济于事。
这在运行时工作正常,但在T4模板中实现DbContext会导致各种问题。它有时会崩溃VS,产生奇怪的错误,产生循环依赖等等。
如果我调试T4模板,它确实运行没有错误,但后台进程锁定包含DbContext类和实体的项目。因此,每次实体发生变化时,我都必须重新启动VS三次,执行不同的步骤。呸!
我想知道是否有办法在不实例化上下文类的情况下检索实体元数据/配置。任何指导都将不胜感激。
答案 0 :(得分:1)
嗯,你需要加载上下文,因为它需要至少调用一次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文件中查询该文件。