EF核心导航属性,无关系(外键)

时间:2020-05-17 20:31:26

标签: entity-framework-core foreign-keys ef-code-first composite-key ef-code-first-mapping

我有三堂课

public class Country
{
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public byte CountryID { get; set; }
        public byte OfficialLangID { get; set; }
}

public class Language
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public byte LangID { get; set; }
}

public class Name
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public byte NameID { get; set; }
    public bool isLanguage { get; set; } // true for language - false for country
    public byte FK { get; set; } // FK=LangID or CountryID
}

现在我要创建导航属性:

  • Country.Name
  • Language.Name
  • 名称。语言
  • 名称。国家/地区

出于多种原因,我想采用这种方式,其中之一是在不加入表的情况下搜索一张表中的所有名称。

请不要提出其他建议,我想要导航属性。

1 个答案:

答案 0 :(得分:2)

为什么要这样做?在这里放一个布尔字段来检查实体的类型没有任何意义吗?最后,ef框架将创建2个表。 这是我的方法:

public class Country
{
        public byte Id {get;set;}
        public string Name {get;set;}

        public int LanguageId {get;set;}
}

public class Language
{
    public byte Id {get;set;}
    public string Name {get;set;}

    // assuming that each language may have one or many countries
    public ICollection<Country> Countries {get;set;}
}
此处的

ef核心将自动创建表和关系。现在,如果您看到一些重复的代码(如我所了解的),则这两个实体使用相同的字段类型和名称,这是您可以做的

public abstract class EntityBase
{
        public byte Id {get;set;}
        public string Name {get;set;}
}

现在将此抽象类继承到实体类

public class Country : EntityBase
{
        public int LanguageId {get;set;}
}

public class Language : EntityBase
{
    public ICollection<Country> Countries {get;set;}
}