C# EntityFramework 6如何通过反射获取标识字段?

C# EntityFramework 6如何通过反射获取标识字段?,c#,entity-framework,reflection,entity-framework-6,C#,Entity Framework,Reflection,Entity Framework 6,我有一个带有类型参数T的通用方法,其中T是EF模型中实体的类型。 我需要获取此类型中标识字段的名称。 我看到这篇文章: 但我不明白,当Tevin谈到实体挫折和实体类型库类型时,他在说什么。 如果EntityTypeBase是模型中一个实体的类型,那么EF6就没有属性KeyMembers我认为仅通过反射不可能获得主键 首先,让我们了解EF如何确定哪个属性将成为主键,而不考虑顺序/优先级 由 主键的实体框架约定为: 您的类定义了一个名为“ID”或“ID”的属性 或后面跟“ID”或“ID”的类名

我有一个带有类型参数T的通用方法,其中T是EF模型中实体的类型。 我需要获取此类型中标识字段的名称。 我看到这篇文章: 但我不明白,当Tevin谈到实体挫折实体类型库类型时,他在说什么。
如果EntityTypeBase是模型中一个实体的类型,那么EF6就没有属性KeyMembers

我认为仅通过反射不可能获得主键

首先,让我们了解EF如何确定哪个属性将成为主键,而不考虑顺序/优先级

主键的实体框架约定为:

  • 您的类定义了一个名为“ID”或“ID”的属性
  • 或后面跟“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
    函数中提取密钥仍然很困难,所有内容都被封装。你可以查一下电话号码。EF中的所有内容都取决于并且一旦调用了
    ObjectContext
    ,例如这行代码

    ((IObjectContextAdapter)context).ObjectContext
    
    然后将建立到数据库的连接,您可以使用探查器进行检查。下面是源代码的代码摘录

    public override ObjectContext ObjectContext
    {
        get
        {
            Initialize();
            return ObjectContextInUse;
        }
    }
    
    public void Initialize()
    {
        InitializeContext();
        InitializeDatabase();
    }
    
    因此目前获取主键的唯一可能方法是通过对象集、实体集、键成员等,如中所述


    看看@YuliamChandra,谢谢你的回复。所以,根据我的理解,从上下文和代码中获取的关键成员创建了使用一些系统资源的实体集。有没有其他方法可以通过反射来获取密钥字段名?这不是一个纯粹的反射,它需要首先使用edm来获取密钥名,这一点在文章中已经解释过了,因为可以使用and将密钥属性配置为密钥字段,这是我们仅通过反射无法获得的,所有数据都在DbContext中。除了使用CreateObjectSet()方法创建ObjectSet外,没有其他方法可以获取密钥名吗???回答得很好。。。关于[KeyAttribute]。。。最好使用“Where”而不是“FirstOrDefault”,因为我的一些实体具有复合键。
    var keyNames = set.EntitySet.ElementType.KeyMembers.Select(k => k.Name);