从EF6数据库中的DbSet获取外键字段

时间:2018-09-24 13:52:59

标签: c# database entity-framework entity-framework-6 ef-database-first

我有一个正常工作的数据库,并且我正在使用EntityFramework操纵其数据。我以DbSet<Type>DbContext结尾,我需要一种使用任何可用方式来检索匿名类型中的任何外键的方法

自动生成的EF类的代码示例

public partial class Country
{
   public int ID { get; private set; } //primaryKey
   public ICollection<City> Cities { get; set; }
}

public partial class City
{
   public int City_ID { get; private set; } //primaryKey
   public int Country_ID { get; private set; } //ForeignKey Needed To get For Any Entity or Class
   public Country Country { get; set; }
}

自动生成的DbContext子对象

public partial class Entities : DbContext
{
   public virtual DbSet<Country> Countries { get; set; }
   public virtual DbSet<City> Cities { get; set; }
}

我需要从Country_ID获得所有类似DbSet<{UnknownType}>的外键

1 个答案:

答案 0 :(得分:0)

在没有DataAnnotation的情况下,实体类中的属性不包含有关其关系的任何信息。所有关联数据都在上下文中的OnModelCreating中定义。

我可以想到的唯一合理的方法是使用System.ReflectionSystem.ComponentModel.DataAnnotations来获取外键。 Tutorial

您的实体类如下所示。

public partial class Country
{
     [Key]
     public int ID { get; private set; }
     public ICollection<City> Cities { get; set; }
} 

public partial class City
{
     [Key]
     public int City_ID { get; private set; } 

     [ForeignKey("Country")]
     public int Country_ID { get; private set; } 
     public Country Country { get; set; }
}

然后,您可以制作将通过类的属性查找并找到已定义外键的所有属性的方法。这种方法看起来像这样。

Public static List<string> GetForeignKeyNamesOfClass(Type classType)
{
      List<string> foreignNameList = new List<string>();
      PropertyInfo[] propertyInfoArray = classType.GetProperties();

      foreach(PropertyInfo info in propertyInfoArray)
      {
           if(Attribute.IsDefined(info, typeof(ForeignKeyAttribute)))
           {
                foreignNameList.add(info.Name)
           }
      }

      return foreignNameList;
}

然后您将其命名为

GetForeignKeyNamesOfClass(typeof(City));

希望有帮助