C# EF6 Code First TPH - 两个使用注释继承同一实体的实体的导航属性

标签 c# sql-server entity-framework inheritance

我有一个关于 EF6 的问题。假设我有一个如下所示的抽象基类:

[Table("Persons")]
public abstract class Person
{
    [Key]
    public int Id { get; set; }

    [Required, ForeignKey("Group")]
    public int GroupId { get; set; }

    [Required(AllowEmptyStrings = true), MaxLength(150)]
    public string FirstName { get; set; }

    [Required(AllowEmptyStrings = true), MaxLength(150)]
    public string LastName { get; set; }
}

然后有两个继承Person的实体:

[Table("Persons")]
public class Teacher : Person
{
    [Required]
    public int ExpirienceInYears { get; set; }
}

[Table("Persons")]
public class Student : Person
{
    [Required]
    public int Age { get; set; }
}

这对我来说很好。我们有一些 TPH,这就是为什么我们有一个鉴别器列。好的,很好,但我的问题是表 Groups 中的导航属性实际上看起来像这样:

[Table("Groups")]
public class Group
{
    [Key]
    public int Id { get; set; }

    [Required(AllowEmptyStrings = true), MaxLength(150)]
    public string Name { get; set; }

    public virtual ICollection<Teacher> Teachers { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

导航属性似乎负责在名为 Persons 的表中生成两列:Group_IdGroup_Id1,它们始终为空。我不需要这些列,因为在此表中已经有一个列 GroupId 指向 Groups。导航属性也不起作用,所以我想我做错了什么。

Persons 表如下所示:

Id |  GroupId | FirstName | LastName | ExpirienceInYears | Age | Discriminator | Group_Id | Group_Id1

但我希望这张表看起来像:

Id |  GroupId | FirstName | LastName | ExpirienceInYears | Age | Discriminator

如果我删除导航属性,一切都很好,但我很想保留它们,因为它们真的很方便。有什么想法吗?

最佳答案

问题是您正在配置两个一对多关系,一个在 TeacherGroup 之间,另一个在 StudentGroup,这样您的 Persons 表中就有两个额外的 FK 列(Group_IdGroup_Id1)。要实现您想要的效果,您只需要通过这种方式在 PersonGroup 之间建立一种关系:

[Table("Persons")]
public abstract class Person
{
    [Key]
    public int Id { get; set; }
    //...
    [ForeignKey("Group")]
    public int GroupId { get; set; }

    public virtual Group Group { get; set; }
}

[Table("Groups")]
public class Group
{
    [Key]
    public int Id { get; set; }

    //...
    public virtual ICollection<Person> Persons { get; set; }    
}

然后,如果您需要与特定组的学生一起工作,您可以这样过滤他们:

var group=db.Groups.Find(1);//search an specific group
var students=group.Persons.OfType<Student>();// get all the students of that group

关于C# EF6 Code First TPH - 两个使用注释继承同一实体的实体的导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29038029/

相关文章:

c# - 用户编辑后数据网格单元格格式不保留?

c# - 遍历 XAML 定义的标签

c# - 如何为生成一系列匿名类型的 linq 查询声明全局变量

c# - 如何从 SQL Server 获取 ado.net 中数字数据类型的值

sql-server - 与数据库快速交互

c# - NHibernate 和版本控制(时间戳)

sql-server - sql server 排序规则是否意味着列名必须大小写正确?以及如何处理这个问题

entity-framework - Entity Framework : about OptimisticConcurrencyException

c# - 使用左连接获取不适当的输出

entity-framework - 无法从模型生成数据库 : System. EntryPointNotFoundException