C# 如何首先使用EF代码从两个不同的表到第三个表中的同一列创建关系?

C# 如何首先使用EF代码从两个不同的表到第三个表中的同一列创建关系?,c#,entity-framework,ef-code-first,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 lon

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

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类型的字段,可以存储StudentGuid或TeacherGuid

所以我必须将StudentUserId和TeacherUserId连接到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);
    }
}
但我得到了这个错误:

依赖角色引用密钥属性,依赖角色的多重性上限必须为“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);
    }
}

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

尽管@Mark answer正在回答您的问题。但你可以有不同的方法


正如您所说,两个表中的所有字段都是相同的,因此您只能有一个表,该表将有一个类型字段,它将告诉您键入的是其学生还是教师。您可以将Id和Type设置为复合主键,并在其他表中引用。因此,您只需使用一列就可以实现您想要的任何功能。

拼写错误提示:这是一个字段,而不是一个字段……您是说现有的玩家表中有一个字段PlayerUserId,它有时是学生表的外键,有时是教师表的外键?数据库如何知道外键指向哪个表?