我知道这是一个重复的问题,我知道如果"中间有其他属性,这是不可能的。表
我知道如何获得m:N关系的效果而不是1:n-n-1,但我还想听听其他一些想法。
如果我有三个实体,A,B和AB,其中AB使A:B关系成为可能,并且它具有其他属性。
使用Databasefirst方法,我想要制作A和B的部分类。
public partial Class A
{
public IEnumerable<EntityObject> Bs
{
get
{
return this.Select(p=>p.AB.B);
}
set { //... }
}
}
这样的事情是可能的。
只是涂鸦在脑海里。我目前正在度假,没有电脑,所以这个没有经过测试,只是写在我的手机上。
我发现在上下文处理或分离之后这可能是一个问题,也包括在一个急切的加载方法中。
有什么想法吗?
答案 0 :(得分:1)
如果技术上可能或没有,表达具有这样的关系“的附加属性中的中间表”尽可能多的一对多关系是错误的,因为它隐藏了“中间表”具有商业意义,因此必须是一个独立的实体。
这种模型的一个经典示例是RawMaterial
和Product
:RawMaterial
可以在多个Product
中使用,Product
可以使用RawMaterial
由多个RecipePart
组成。中间的实体 - 可能称为Quantity
- 包含RawMaterial
给定Product
中给定ChocolateBar
的多少部分。
如果您拥有产品ChocolateBar
并使用其与原材料的关系,您将处理一个食谱,其中Chocolate
有60个单位Milk
和40个单位ChocolateBar
,即RecipePart
有RecipePart
个集合,每个RawMaterial
都会描述数量,并引用相关的ChocolateBar
。 RawMaterial
不在此商业模式中直接收集this.Select(p=>p.AB.B);
。
对于特定的查询(可能是某些统计数据),您可能只对其原材料感兴趣 - 如果巧克力和牛奶,无论多少单位,都会制作巧克力棒 - 但这是您商业模式中的特殊查询和种类忽略某些完整详细模型信息的聚合。这是你的助手属性RawMaterial
所做的:它不表达完整的关系,但它是一个专门的查询,说:给我Product
只set { //... }
,我不想知道每个数量。
特征性地,您已将属性设置器RawMaterial
保留为存根。在添加或更改实体时,很明显这种关系不可能是多对多的。无法仅将Product
的列表分配给RawMaterial
。您必须添加信息,以获取有效Product
模型的每个Product
的单位数,这意味着RecipePart
必须与“中间实体”{{1}}相关。
答案 1 :(得分:1)
如果您已经将AB视为一个独特的实体,那么从A获得所有B所需要的就是这样:
public partial class A
{
public IQueryable<B> Bs {
get { return this.ABs.AsQueryable().Select(ab => ab.B).Distinct(); }
}
}
与EF支持的内置多对多(没有任何有效负载)相比,我不确定它的性能如何,但它会为您提供所需的信息。