2015-03-13 31 views
1

我有一個關於EF6的問題。比方說,我有一個抽象基類,看起來像這樣:C#EF6代碼優先TPH - 導航屬性給兩個使用註釋的同一個實體的實體

[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,這就是爲什麼我們有一個Discriminator列。 OK,不錯,但我的問題是表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; } 
} 

好像導航性能是負責在表者兩列的生成被命名爲:Group_Id並且Group_Id1女巫總是空的。我不需要這個列,因爲在這個表中已經有一列GroupId,指向Groups。此外導航屬性不工作,所以我認爲我做錯了什麼。

Persons樣子:

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

,但我想這個表看起來像:

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

如果刪除了導航性能一切正常,但我很想讓他們因爲它們非常方便。有任何想法嗎?

回答

2

的問題是要配置兩個一到多的關係,一個TeacherGroupStudentGroup之間的另一之間,這是在你的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 
相關問題