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,它有时是学生表的外键,有时是教师表的外键?数据库如何知道外键指向哪个表?