1

シナリオ:

hereで述べたように、追加のプロパティを単純な結合テーブル (多対多の関係) に追加すると、それは隠れた関連付けではなくなります。これらの質問もこれに対処します。

既存のコードでは、単純な自動的に非表示のナビゲーション プロパティが既に使用されており、自動生成されたテーブルには若干のカスタマイズが加えられているため、基になる関係テーブルを変更するときにプロジェクト全体をリファクタリングすることは避けたいと考えています。

質問:

自動ナビゲーション (多対多) アクセサーの両方を残す方法はありますが、関係エンティティにも直接アクセスできますか?

リレーションシップ テーブルから選択する独自のアクセサーを作成することもできますが、それらはもはや存在しないためEntityCollections、追跡などの内部で発生する魔法が失われるのではないかと心配しています。

EntityCollectionsエンティティに手動で追加できますか?

期待:

元は:Product* <-> *Offer

  • 製品には多くのオファーがあります (50% オフ、BOGO など)
  • 同じオファーが多くの製品に適用される可能性があります (「赤シャツ」と「青パンツ」は BOGO です)

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

  • 製品のオファーをリストするとき、それらを個別に並べ替えることができます
  • たとえば、「赤いシャツ」には「50% オフ」の後に「BOGO」が表示されますが、「ブルー パンツ」には「BOGO」の次に「50% オフ」が表示されます。

それから私はできるようにしたいと思います:

// 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方法は、自動生成されていないクラスに 2 つのプロパティを手動で追加することだと思います。

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 に答える