2016-11-30 78 views
0

我有一个实体作为学生如何建模一对多的关系指向由不同的实体相同的实体在EF

public class Student{ 

.. 

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

}

与学校实体

public class School{ 

.. 

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

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

在Pictures表中有这些外键是不正确的。

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

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

回答

1

如果图片不能在学校和学生之间共享,您可以为两种图片类型创建单独的实体。要做到这一点,最好的方法是创建每个特定画面类型的基类和派生类:

public abstract class Picture 
{ 
    public int Id { get; set; } 
    // ... 
} 
public class SchoolPicture : Picture 
{ 
    // ... 
} 
public class StudentPicture : Picture 
{ 
    // ... 
} 

然后学校实体引用SchoolPicture和学生实体引用的StudentPicture:

public class School 
{ 
    // ... 
    public virtual ICollection<SchoolPicture> Pictures {get;set;} 
} 
public class Student 
{ 
    // ... 
    public virtual ICollection<StudentPicture> Pictures {get;set;} 
} 

通过这种方式,两个独立的表的照片创建只有一个单一的外键对应的父实体:

Created model

+0

谢谢是的,我想这是实现这一点的最佳方式。但仍然不高兴结束在数据库中的两个表来保存图片.. – akd

+0

和在上下文类中我应该添加2个dbset一个为SchoolPicture和一个为StudentPicture是正确的? – akd

+0

是的,你需要添加两个DbSets,但你只需要,如果你想直接访问图片添加这些;在我的示例中,我只添加了学校和学生的DbSets。有两个独立的实体的好处是,你不能意外地给学生分配一张SchoolPicture。 – Markus

0

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

对于我来说,在图片 表中有这些外键是不正确的。

根据你的学生和学校模型,我期望EF为图片(StudentId和SchoolId)添加2个外键。它应该如何看待你?

今后如果其他实体都需要有照片的名单,然后 这意味着在图片表中的另一外键属性。

如果您创建另一个模型,其中包含ICollection <Picture> Pictures { get; set; }作为属性,那么是的,这将在图片中创建另一个外键。但是,如果你忽略它,它不会。

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

+0

想象一下,我已经添加了5个不同的实体图片收藏。这意味着任何时候我添加一张图片的外键的图片表4必须设置为空,因为那些根本不相关。这对我来说听起来不太好。我像@Markus描述的那样去寻找多态性。 – akd

+0

啊,是的,明白了!是的,@ Markus解决方案可以解决这个问题 – kimbaudi

相关问题