【问题标题】:EntityFramework 6 How to get identity-field with reflection?EntityFramework 6 如何通过反射获得身份字段?
【发布时间】:2014-08-05 14:54:39
【问题描述】:

我有一个带有类型参数 T 的泛型方法,其中 T 是 EF 模型中的实体类型。 我需要获取此类型中标识字段的名称。 看到这篇文章:Is there a way to get entity id-field's name by reflection or whatever? 但是我不明白 Tevin 在谈到 EntitySetBaseEntityTypeBase 类型时在说什么。 如果 EntityTypeBase 是模型中实体之一的类型,则 EF6 没有属性 KeyMembers

【问题讨论】:

  • 看看this post
  • @YuliamChandra 感谢您的回复。因此,KeyMembers 从上下文中获取,据我了解,代码创建了使用一些系统资源的实体集。还有其他方法可以通过反射获取键字段名称吗?
  • 不是纯反射,需要先用edm获取key名,后面有说明,因为key属性可以通过conventionFluent Api配置为key field ,我们不能仅通过反射得到
  • 反正所有数据都在DbContext中。除了使用 CreateObjectSet() 方法创建 ObjectSet 之外,没有其他方法可以获取键名吗???

标签: c# entity-framework reflection entity-framework-6


【解决方案1】:

我认为仅仅通过反射是不可能得到主键的。

首先,让我们看看 EF 如何确定哪些属性将成为主键,而不管顺序/优先级如何

主键的实体框架约定是:

  1. 您的类定义了一个名为“ID”或“Id”的属性
  2. 或类名后跟“ID”或“Id”

我们可以使用GetProperties并比较属性名。

var key = type.GetProperties().FirstOrDefault(p => 
    p.Name.Equals("ID", StringComparison.OrdinalIgnoreCase) 
    || p.Name.Equals(type.Name + "ID", StringComparison.OrdinalIgnoreCase));

我们可以使用CustomAttributes并比较属性类型。

var key = type.GetProperties().FirstOrDefault(p => 
    p.CustomAttributes.Any(attr => attr.AttributeType == typeof(KeyAttribute)));

这是很难做到的,modelBuilder 被封装在OnModelCreating 中,即使我们将modelBuilder 保存为字段/属性,仍然很难从HasKey 函数中提取密钥,一切都被封装了。您可以查看source code。而EF中的一切都依赖于ObjectContext,一旦调用ObjectContext,例如这行代码,

((IObjectContextAdapter)context).ObjectContext

然后将建立与数据库的连接,您可以使用分析器进行检查。这是源代码的代码摘录。

public override ObjectContext ObjectContext
{
    get
    {
        Initialize();
        return ObjectContextInUse;
    }
}

public void Initialize()
{
    InitializeContext();
    InitializeDatabase();
}

因此,目前获取主键的唯一可能方式是通过对象集、实体集、键成员等,如this post中所述

var keyNames = set.EntitySet.ElementType.KeyMembers.Select(k => k.Name);

【讨论】:

  • 很好的答案! ...关于[KeyAttribute] ...最好使用“Where”而不是“FirstOrDefault”,因为我的一些实体具有复合键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2015-09-15
  • 2013-10-24
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多