1

设想:

如此处所述,一旦您将其他属性添加到简单的连接表(多对多关系),它就不再是隐藏关联。这些问题也解决了这个问题:

现有代码已经使用了简单的、自动隐藏的导航属性,并且对自动生成的表进行了一些小的自定义,因此我想在更改基础关系表时避免重构整个项目。

问题:

有没有办法让自动导航(多对多)访问器都可以保留,但我也可以直接访问关系实体?

我可以编写自己的访问器,从关系表中进行选择,但是它们不再存在EntityCollections,因此我担心我会丢失引擎盖下发生的任何魔法,例如跟踪等。

我可以手动添加EntityCollections到实体吗?

期待:

起初:Product* <-> *Offer

  • 一个产品有很多优惠(比如 50% 的折扣,BOGO)
  • 相同的优惠可以适用于许多产品(“红衬衫”和“蓝裤子”是 BOGO)

期望: Product* <-[sort]-> *Offer

  • 当我列出产品的报价时,我可以独立地对它们进行排序
  • 即“Red Shirt”有“50% off”然后是“BOGO”,但“Blue Pants”显示“BOGO”然后是“50% off”

那么我希望能够做到:

// original access, do stuff
List<Offer> applicableOffers = currentProduct.Offers.Where(...);
// hit up the join table directly for properties
var applicableOffersInOrder = applicableOffers.OrderBy(o => o.ProductOffers.Sort);

而不是

var applicableOffersInOrder = currentProduct.ProductOffers
        .OrderBy(o => o.Sort)
        .Offers.Where(...);
4

1 回答 1

0

我认为最简单的方法是在非自动生成的partial类中手动添加两个属性:

partial class Offer
{
    public IQueryable<Product> Products 
    { 
       get { return this.ProductOffers.Select(x => x.Product); } 
    }
}
partial class Product
{
    public IQueryable<Offer> Offers 
    { 
       get { return this.ProductOffers.OrderBy(x => x.Sort).Select(x => x.Offer); } 
    }
}

当您想要添加新的 时,这将无济于事ProductOffer,但是由于您实际上有额外的数据 ( Sort),因此无论如何您都应该通过ProductOffers集合来执行此操作。

于 2013-02-01T17:07:44.283 回答