我有两个完全不同的表,有数千行数据:
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);
}
}
但是我收到了这个错误:
“从属角色”是指关键属性,“从属角色”的多重性的上限必须为“&#39; 1”。
如果这种关系不正确,我该如何处理这种情况。我无法删除我的数据,我必须创建第三个表以某种方式保留以前的数据。
答案 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}}。您可以将Teacher
和Id
作为复合主键,并在其他表中引用。因此,只需使用一列即可实现您想要的任何目标。