0

我有三个班

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
}

现在我想创建导航属性:

  • 国家的名字
  • 语言.名称
  • 姓名.语言
  • 名称.国家

我想这样做有很多原因,其中之一是在一个表中搜索所有名称而不加入。

请不要建议其他方式,我想要导航属性为我的方式。

4

1 回答 1

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 core 将自动创建表和关系。现在,如果您看到一些代码重复(就像我已经理解的那样),这两个实体使用相同的字段类型和名称,这就是您可以执行的操作

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;}
}
于 2020-05-20T21:36:07.010 回答