![](/img/trans.png)
[英]EF Core - How to setup many-to-many for same entity that already has a one-to-many relationship
[英]How to Model One to Many relationship pointing to same entity from different entities in EF
我有一个实体作为学生
public class Student{
..
public ICollection<Picture> Pictures {get;set;}
}
和学校实体
public class School{
..
public ICollection<Picture> Pictures {get;set;}
}
创建该模型并运行迁移时,我可以看到在数据库的Pictures表中已创建了2个外键属性,分别为StudentId和SchoolId。
在Picture表中具有这些外键对我来说似乎不对。
将来,如果另一个实体需要“图片”列表,则意味着“图片”表中的另一个外键属性。
如何在代码优先模型中更改此行为? 还是这是正确的方法?
如果无法在学校和学生之间共享图片,则可以为这两种图片类型创建单独的实体。 最好的方法是为每种特定的图片类型创建基类和派生类:
public abstract class Picture
{
public int Id { get; set; }
// ...
}
public class SchoolPicture : Picture
{
// ...
}
public class StudentPicture : Picture
{
// ...
}
然后,School实体引用SchoolPicture,而Student实体引用StudentPicture:
public class School
{
// ...
public virtual ICollection<SchoolPicture> Pictures {get;set;}
}
public class Student
{
// ...
public virtual ICollection<StudentPicture> Pictures {get;set;}
}
这样,将为图片创建两个单独的表,只用一个外键指向相应的父实体:
在学生模型中,您说的是学生与图片之间存在一对多的关系。 与您的School模型相同。 因此,EF为“学生”和“学校”模型都向“图片”添加了外键。 那是预期的行为。
在Picture表中具有这些外键对我来说似乎不对。
根据您的学生和学校模型,我希望EF为图片添加2个外键(StudentId和SchoolId)。 看起来怎么样?
将来,如果另一个实体需要“图片”列表,则意味着“图片”表中的另一个外键属性。
如果创建另一个包含ICollection <Picture> Pictures { get; set; }
ICollection <Picture> Pictures { get; set; }
ICollection <Picture> Pictures { get; set; }
作为属性,然后是,它将在Picture中创建另一个外键。 但是,如果您忽略它,它不会。
我不确定您的期望。 你能详细说明吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.