实体框架 - 手动将属性添加到多对多关系 - 模型优先

时间:2013-02-01 16:39:13

标签: c# asp.net entity-framework ef-model-first

情景:

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

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

问题:

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

我可以从关系表中选择编写自己的访问者,但之后它们不再是EntityCollections,因此我担心我会失去像跟踪等引起的任何魔法。

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

期望:

最初:Product* <-> *Offer

  • 产品有许多优惠(如50%折扣,BOGO)
  • 同一优惠可适用于多种产品(“红衫军”及“蓝裤子”为BOGO)

所需:Product* <-[sort]-> *Offer

  • 当我列出产品的优惠时,我可以单独对其进行排序
  • 即。 “Red Shirt”有“50%折扣”然后“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(...);

1 个答案:

答案 0 :(得分: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集合进行此操作