繁体   English   中英

如何在EF中指向来自不同实体的同一实体的一对多关系建模

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM