【问题标题】:Is there any way to view Entity Framework Code First's column mappings at runtime?有没有办法在运行时查看 Entity Framework Code First 的列映射?
【发布时间】:2011-10-28 09:42:54
【问题描述】:

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

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

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

public string GetMappedColumnName<TFrom>(DbContext context, 
    Func<TFrom, object> selector);

会这样使用:

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

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

【问题讨论】:

标签: c# entity-framework reflection ef-code-first


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 一旦我有了GlobalItem 入口点,剩下的就很简单了!谢谢。
  • 为什么获取这些信息如此复杂?当谈到批量插入的性能时,EF 真的很糟糕。您可以使用自定义 EntityDataReader 和 SqlBulkCopy 来完成工作,但前提是您拥有这些映射。我不想一遍又一遍地对这些映射进行硬编码,只是为了在这些映射之一发生变化时必须进行手动修复。我知道,OR/M 与批量数据无关。但请考虑从必须进行批量插入的其他系统导入。现在呢?
  • @Sebastian:这些是 ADO.NET 团队的问题。我无法回答为什么它如此复杂,但这就是 MS API 通常的工作方式——它们在内部很复杂,并且对任何最初不由 MS 设想的扩展都是封闭的。
  • 是否可以提供访问列名的路径?我看到的只是对象的属性名,而不是列名
  • 事实上这篇文章帮助我获得了 ef 中映射列的名称:stackoverflow.com/questions/20161854/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多