EF6中片面的多对多关系

时间:2014-06-03 13:33:45

标签: c# asp.net entity-framework

这是我的意思的一个例子:

我们有一个Color类,其中包含一些关于某种颜色的信息:

public class Color
{
    public int ID { get; set; }

    public int R { get; set; }
    public int G { get; set; }
    public int B { get; set; }
    // ... more properties
}

一个Palette类,它是一组颜色(即有很多颜色)。

public class Palette
{
    public int ID { get; set; }

    public string Name { get; set; }
    // ... more properties

    public virtual ICollection<Color> Colors { get; set; }
}

所以Palette有很多不同的颜色,Color可以是多个Palettes的一部分,但Color不必知道它属于什么Palettes。

建立这种关系的最佳方法是什么?我知道你可以创建一个连接表,然后创建Colors属性以从连接表中获取颜色的集合。是否可以在没有连接表的情况下对这种单侧关系建模,所以我不必创建另一个模型并在数据库中有另一个表?

我也相信这会导致在Color表中创建一个名为Palette_PaletteID的列或类似的东西。由于从未使用此列,是否有某种方法可以防止它被创建?

2 个答案:

答案 0 :(得分:2)

这就是EF的工作方式,在数据库中建立关系和参照完整性。

但是,如果您希望Color不了解Palettes,您可以简单地创建另一个更集中的数据访问层,其中包含专用实体和DbContext,其中包含您希望它们的关系。在域驱动设计术语中,这称为有界上下文。见http://msdn.microsoft.com/en-us/magazine/jj883952.aspx。因此,您将拥有创建所有可能关系的主要DbContext,以及另一个轻量级且专注于您的特定需求的关系。

答案 1 :(得分:2)

我认为你正在以错误的方式看待这个问题。当使用像Entity Framework这样的ORM时,除非你特意遇到由数据库问题引起的性能问题,否则你不应该担心它产生的表。

将会发生以下两件事之一:EF将创建一个查找表,其中包含与每个调色板ID关联的颜色ID列表,或者它将为每个调色板创建多个条目,每个调色板具有每个调色板的托盘ID它属于。坦率地说,我认为其中任何一个都很好,你也应该这样做,直到遇到由此引起的特定问题。