1

我知道这是一个重复的问题,我知道如果“中间”表中有其他属性,这是不可能的。

我有一个想法如何获得 m:N 关系而不是 1:nn-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 { //... }
    }
}

像这样的事情是可能的。

只是在我的脑海里涂鸦。我目前正在度假,没有电脑,所以这没有经过测试,只是写在我的手机上。

我发现在上下文处理或分离之后,这可能是一个问题,也包括在急切加载方法中。

有什么想法吗?

4

2 回答 2

1

无论技术上是否可行,将这种与“中间表中的附加属性”的关系表示为多对多关系是错误的,因为它隐藏了“中间表”具有业务意义,因此必须是一个实体在其自己的。

这种模型的一个有点经典的例子是RawMaterialand Product: ARawMaterial可以在多个Products 中使用,并且 aProduct可以由多个RawMaterials 组成。介于两者之间的实体(可能称为RecipePart)包含在Quantity给定RawMaterial中使用给定的数量Product

例如,如果您有产品ChocolateBar并处理其与原材料的关系,您将处理一个配方,该配方说 aChocolateBar有 60 个单位Chocolate和 40 个单位Milk,即ChocolateBarRecipeParts 的集合,并且每个都RecipePart描述数量并引用相关的RawMaterial. A在此业务模型ChocolateBar中没有直接的 s 集合。RawMaterial

对于特定的查询(可能是一些统计数据),您可能只对它的原材料感兴趣 - 巧克力棒是由巧克力和牛奶制成的,无论有多少单位 - 但这是您的业务模型中的一个特殊查询和一种聚合这忽略了一些完整的详细模型信息。这就是你的辅助属性this.Select(p=>p.AB.B);所做的:它不表达完整的关系,而是一个专门的查询,它说:只给我这个RawMaterials Product,我不想知道每个数量。

典型地,您将属性设置器留给set { //... }了存根。添加或更改实体时,很明显关系不能是多对多的。不能仅将RawMaterials 列表分配给 a Product。您必须添加信息每个有多少单位RawMaterial才能获得有效Product模型,这意味着Product必须与“中间实体”相关RecipePart

于 2013-06-20T21:27:11.180 回答
1

如果您已经将 AB 视为一个不同的实体,那么要从 A 中获取所有 B,您所需要的就是这样的:

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

与 EF 支持的内置多对多(没有任何有效负载)相比,我不确定它的性能如何,但它会给你你所要求的。

于 2013-06-21T23:04:20.560 回答