【问题标题】:Entity Framework - Manually Add Properties to Many-to-Many Relationship - Model First实体框架 - 手动将属性添加到多对多关系 - 模型优先
【发布时间】:2013-02-01 16:39:13
【问题描述】:

场景:

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

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

问题:

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

我可以编写自己的访问器,从关系表中选择,但它们不再是 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(...);

【问题讨论】:

  • hm...由于我只关心一个方向的排序,我想知道我是否可以像@ladislav 在这里所做的那样在模型设计器中创建多个一对多关联:stackoverflow.com/questions/9043453/…

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


【解决方案1】:

我认为最简单的方法是在非自动生成的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 集合来执行此操作。

【讨论】:

  • 我就是这么想的。但是,据我了解,应该是IQueryable 才能获得延迟加载等的好处;我希望我能更进一步,将其声明为EntityCollection,就像.edmx 一样。
  • 你说得对,IQueryable 是更好的选择。已编辑。将其设为EntityCollection 有什么好处?
  • 老实说我不知道​​,但我认为当 EF 这样做时,它最初是 EntityCollection 是有充分理由的。 EF 自己进行更改跟踪和优化获取,所以我不想仅仅因为我想要更少的输入而错过任何魔法。
  • 请注意,EF 不会在查询中接受这些属性,因为它们不是导航属性。我会犹豫使用这样的快捷方式。太容易遇到延迟加载异常,因为您应该在查询中使用Include ProductOffersOffer 以使Offers 在转换为IEnumerable 后可用。
  • 接受代替更理想的解决方案...我尝试手动添加原始自动生成的 .edmx AssociationSet 内容,但无法避免重复命名。
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 2013-03-17
相关资源
最近更新 更多