EF6中的单侧多对多关系
本文关键字:关系 单侧多 EF6 | 更新日期: 2023-09-27 18:06:19
下面是我的意思的一个例子:
我们有一个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; }
}
所以一个调色板有很多不同的颜色,一个颜色可以是多个调色板的一部分,但是一个颜色不需要知道它属于哪个调色板。
建立这种关系的最好方法是什么?我知道您可以创建一个连接表,然后创建Colors
属性以从连接表中获取Colors集合。是否有可能在没有连接表的情况下对这种单侧关系进行建模,这样我就不必在数据库中创建另一个模型和另一个表了?
我还认为这会导致在Color表中创建一个名为Palette_PaletteID的列或类似的东西。由于这个列从未使用过,是否有某种方法可以防止它被创建?
EF就是这样工作的,在数据库中建立关系和引用完整性。
然而,如果你想让你的Color不知道palette,你可以简单地创建另一个更集中的数据访问层,它包含专门的实体和DbContext, DbContext包含你想要的关系。在领域驱动设计术语中,这被称为有界上下文。见http://msdn.microsoft.com/en-us/magazine/jj883952.aspx。因此,您将有一个主DbContext,它将创建所有可能的关系,另一个是轻量级的,专注于您的特定需求。
我认为你看错了。当使用像实体框架这样的ORM时,你不必担心它产生的表,除非你特别遇到由数据库问题引起的性能问题。
将发生两件事之一:EF将创建一个查找表,其中包含与每个调色板ID相关联的颜色ID列表,或者它将为每种颜色创建多个条目,每种颜色都有其所属的每个调色板的托盘ID。坦率地说,我认为这两种方法都很好,你也应该这样假设,直到你遇到由它引起的具体问题。