有没有办法在运行时查看Entity Framework Code First的列映射?

我正在尝试编写Entity Framework Code First的附加组件,我需要一种方法来在运行时获取模型列的配置。 例如,这是OnModelCreatingDbModelBuilder上的代码设置:

 builder.Entity() .Property(n => n.ReportsToID).HasColumnName("ReportsTo"); 

完成此操作后,EntityFramework知道我的属性名称与表中的列名称不同,但是如何在运行时找到字符串"ReportsTo"ReportsToID相关ReportsToID ? 理想情况下,我正在尝试编写如下方法:

 public string GetMappedColumnName(DbContext context, Func selector); 

将使用如下:

 string mappedColumnName = GetMappedColumnName(context, x => x.ReportsToID); 

我只是不知道在DbContext中找到映射列名的位置。 他们甚至可以访问吗?

理论上是的。 实际上我不确定,因为通过简单的测试,我无法在运行时获取这些信息 – 我在调试器中看到它们但我无法获取它们,因为我需要使用的类型是entity framework中的内部。

理论。 所有映射信息都在运行时可用,但不能通过reflection获得。 它们存储在MetadataWorkspace类的实例中,该类绝对不是为直接使用而设计的,因为在找到如何获取所需数据之前,与此类的每次交互都需要在调试器中花费一些时间。 无法通过DbContext API访问此数据。 您必须将DbContext转换回ObjectContext并访问MetadataWorkspace

 ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext; GlobalItem storageMapping = objContext.MetadataWorkspace.GetItem("NameOfYourContextClass", DataSpace.CSSpace); 

现在, storageMappingSystem.Data.Mapping.StorageEntityContainerMapping类的实例,它是internal 。 据我所知,这个类应该是MSL =存储和概念模型之间映射的运行时表示。

如果您使用调试器,您可以浏览实例,您将找到有关属性和列之间的映射(它的嵌套非常深)的信息,因此您也可以使用reflection来获取它们,但它反映了您不拥有的类的非公共接口所以任何.NET框架补丁/修复/更新都可能破坏您的应用程序。