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 { //... }
    }
}

这样的事情可能发生吗?

只是在脑子里乱画。我现在在度假,没有电脑,所以没有测试,只是写在我的手机上。

我看到这可能是上下文处理或分离后的问题,也包括在急于加载方法中。

任何想法吗?

EF与附加属性的多对多关系

如果您已经将AB视为一个独立的实体,那么要从a中获得所有B,您需要做的就是这样:

public partial class A
{
    public IQueryable<B> Bs {
        get { return this.ABs.AsQueryable().Select(ab => ab.B).Distinct(); }
    }
}

我不确定与EF支持的内置多对多(没有任何有效负载)相比,这将执行得有多好,但它会给你你所要求的。

无论技术上是否可行,用"中间表中的附加属性"来表示这种关系是多对多关系,这是错误的,因为它隐藏了"中间表"具有业务含义,因此必须是一个独立的实体。

这种模型的一个比较经典的例子是RawMaterialProduct:一个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);所做的:它不表达完整的关系,而是一个专门的查询,它说:给我这个ProductRawMaterial s,我不想知道每个数量。

典型地,您将属性设置器set { //... }保留为存根。在添加或更改实体时,关系显然不能是多对多的。不可能只将RawMaterial的列表赋值给Product。您必须添加每个RawMaterial的多少个单元的信息才能得到一个有效的Product模型,这意味着Product必须与"中间实体"RecipePart相关。