如何使用EF代码首先在第3个表中创建从2个不同表到同一列的关系?

时间:2018-04-21 10:24:39

标签: c# entity-framework ef-code-first

我有两个完全不同的表,有数千行数据:

public class Student
{
    public Guid StudentUserId { get; set; }
    // Fields for students
}

public class Teacher
{
    public Guid TeacherUserId { get; set; }
    // Fields for teachers
}

public class Player
{
    public long Id { get; set; }

    // Extra Fields
    public Guid PlayerUserId { get; set; }

    public Teacher Teacher { get; set; }

    public Student Student { get; set; }

    // Fields for Player no difference between teacher and student, JUST PLAYER
}

Player课程中,Guid类型的字段可以存储StudentGuidTeacherGuid

所以我必须将StudentUserIdTeacherUserId连接到PlayerUserId

所以我创建了一个这样的地图:

public class PlayerMap : EntityTypeConfiguration<Player>
{
    public PlayerMap()
    {
        HasKey(x => x.Id);

        //...

        HasRequired(x => x.Teacher)
            .WithMany()
            .HasForeignKey(x => x.PlayerUserId);
        HasRequired(x => x.Student)
            .WithMany()
            .HasForeignKey(x => x.PlayerUserId);
    }
}

但是我收到了这个错误:

  

“从属角色”是指关键属性,“从属角色”的多重性的上限必须为“&#39; 1”。

如果这种关系不正确,我该如何处理这种情况。我无法删除我的数据,我必须创建第三个表以某种方式保留以前的数据。

2 个答案:

答案 0 :(得分:1)

不能有一个外键列有时会引用一个表,有时会引用另一个表。

如果您遇到这种情况,则需要两个单独的外键字段 - 一个用于学生,一个用于教师 - 并确保其中一个字段填充了一个值任何给定的时间。

public class Player
{
    public long Id { get; set; }

    // Foreign Key for "Teacher"
    public Guid? TeacherId { get; set; }

    // Foreign Key for "Student"
    public Guid? StudentId { get; set; }

    public Teacher Teacher { get; set; }
    public Student Student { get; set; }

    // Fields for Player no difference between teacher and student, JUST PLAYER
}

public class PlayerMap : EntityTypeConfiguration<Player>
{
    public PlayerMap()
    {
        HasKey(x => x.Id);
        //...

        HasOptional(x => x.Teacher)
            .WithMany()
            .HasForeignKey(x => x.TeacherId);
        HasOptional(x => x.Student)
            .WithMany()
            .HasForeignKey(x => x.StudentId);
    }
}

答案 1 :(得分:0)

您不能将一列作为引用两个表的外键。

虽然@Mark的回答正在回答你的问题。但你可以有不同的方法。

正如您所说,两个表中的所有字段都相同,因此您只能拥有一个包含type字段的表,它会告诉您输入Student或{ {1}}。您可以将TeacherId作为复合主键,并在其他表中引用。因此,只需使用一列即可实现您想要的任何目标。