如何建模一对多关系指向EF

时间:2016-11-30 19:20:59

标签: c# entity-framework

我有一个实体作为学生

public class Student{

..

 public ICollection<Picture> Pictures {get;set;}

}

学校实体

public class School{

..

public ICollection<Picture> Pictures {get;set;}
}

当我创建此模型并运行迁移时,我可以看到数据库中的Pictures表中的外键属性已创建为StudentId和SchoolId。

将这些外键放在图片表中对我来说并不合适。

将来如果另一个实体需要有图片列表,那么这意味着图片表中的另一个外键属性。

如何在代码优先模型中更改此行为?或者这是正确的方法?

2 个答案:

答案 0 :(得分:1)

如果学校和学生之间无法共享图片,您可以为这两种图片类型创建单独的实体。执行此操作的最佳方法是为每种特定图片类型创建基类和派生类:

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;}
}

这样,为图片创建了两个单独的表,只有一个外键到相应的父实体:

Created model

答案 1 :(得分:0)

在您的学生模型中,您说学生与图片之间存在一对多的关系。您的学校模型也是如此。因此EF为学生和学校模型添加了Picture的外键。这是预期的行为。

  

在图片中包含这些外键对我来说并不合适   表

根据您的学生和学校模型,我希望EF为Picture(StudentId和SchoolId)添加2个外键。你应该怎么看?

  

将来如果另一个实体需要有图片列表那么   这意味着图片表中的另一个外键属性。

如果您创建另一个包含 $.fn.modal.Constructor.prototype.adjustDialog = function () { }; 作为属性的模型,那么是,这将在Picture中创建另一个外键。但如果省略它,它就不会。

我不确定你在期待什么。你能详细说明吗?