【问题标题】:get foreign key fields from DbSet in EF6 database First [duplicate]首先从EF6数据库中的DbSet获取外键字段[重复]
【发布时间】:2018-09-24 13:52:59
【问题描述】:

我有一个工作数据库,我正在使用 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 Child

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

我需要从DbSet&lt;{UnknownType}&gt; 获取像Country_ID 这样的所有foreignKeys

【问题讨论】:

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


    【解决方案1】:

    在没有 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));
    

    希望对你有帮助

    【讨论】:

    • 实体类由 EF 自动生成,如果重新生成代码,任何更改都可能被覆盖。它总是有这个评论 //-------------------------------------------------------- ----------------------------------- // // 此代码是从模板。 // // 手动更改此文件可能会导致您的应用程序出现意外行为。 // 如果重新生成代码,将覆盖对此文件的手动更改。 // 自动生成> //---------------------------------------- ----------------------------------
    • 公平地说,你不必担心它,如果你不会在实体类中疯狂。如果要添加文档,无论如何都必须修改它们。如果您不为外键添加注释,您将很难做出您所要求的。关系在 OnModelCreating in Context 中定义。实体类中的属性没有类似的东西。
    • 实体类中的属性没有关于其关系的任何信息 -- 没有,但 EF 有大量的元数据。确实没有必要为此添加属性。
    • @Gert Arnold 哦,每天你都会学到一些新东西。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多