EF与附加属性的多对多关系
本文关键字:关系 属性 EF | 更新日期: 2023-09-27 18:19:09
我知道这是一个重复的问题,我知道如果在"in the middle"表中有额外的属性,这是不可能的。
我有一个想法,如何获得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 { //... }
}
}
这样的事情可能发生吗?
只是在脑子里乱画。我现在在度假,没有电脑,所以没有测试,只是写在我的手机上。
我看到这可能是上下文处理或分离后的问题,也包括在急于加载方法中。
任何想法吗?
如果您已经将AB视为一个独立的实体,那么要从a中获得所有B,您需要做的就是这样:
public partial class A
{
public IQueryable<B> Bs {
get { return this.ABs.AsQueryable().Select(ab => ab.B).Distinct(); }
}
}
我不确定与EF支持的内置多对多(没有任何有效负载)相比,这将执行得有多好,但它会给你你所要求的。
无论技术上是否可行,用"中间表中的附加属性"来表示这种关系是多对多关系,这是错误的,因为它隐藏了"中间表"具有业务含义,因此必须是一个独立的实体。
这种模型的一个比较经典的例子是RawMaterial
和Product
:一个RawMaterial
可以用于多个Product
,一个Product
可以由多个RawMaterial
组成。中间的实体——可能被称为RecipePart
——包含一个Quantity
,给定RawMaterial
的多少块被用于给定Product
。
例如,如果你有产品ChocolateBar
,并处理它与原材料的关系,你将处理一个配方,说ChocolateBar
有60个单位的Chocolate
和40个单位的Milk
,即ChocolateBar
有一个RecipePart
的集合,每个RecipePart
描述了数量并引用了相关的RawMaterial
。在此业务模型中,ChocolateBar
不具有RawMaterial
的直接集合。
对于一个特定的查询(可能是一些统计数据),您可能只对原材料感兴趣——巧克力棒是由巧克力和牛奶制成的,不管有多少个单位——但这是您的业务模型中的一个特殊查询,并且是一种忽略了完整详细模型信息的一些片段的聚合。这就是你的助手属性this.Select(p=>p.AB.B);
所做的:它不表达完整的关系,而是一个专门的查询,它说:给我这个Product
的RawMaterial
s,我不想知道每个数量。
典型地,您将属性设置器set { //... }
保留为存根。在添加或更改实体时,关系显然不能是多对多的。不可能只将RawMaterial
的列表赋值给Product
。您必须添加每个RawMaterial
的多少个单元的信息才能得到一个有效的Product
模型,这意味着Product
必须与"中间实体"RecipePart
相关。