1

私はこの集約ルートを持っています

CustomerGroup
int Id
string Name
Customer[] Customers

そして、これ

Customer
int Id
string Name

私のモデルはEF 4を使用して構築されました。私が好むのは(集約ルートの概念に固執するため)

CustomerGroup
int Id
string Name
int[] Customers

これをどうしますか?

顧客は多数のグループ (多対多の関係) に属している可能性がありますが、一方向のグループ -> 顧客の関係のみが必要です。顧客 -> グループが必要なユースケースはありません。

4

2 に答える 2

2

Customerと の間に多対多の関連付けCustomerGroupがあるため、いわゆるジャンクション テーブルもあります。たとえばCustomerGroupCustomer、 と がCustomerIdありCustomerGroupIdます。

このテーブルにこれら 2 つのフィールドしかない場合、EF はそれを暗黙的に使用できます。つまり、マッピングでジャンクション テーブルであることを示すコレクションCustomerGroupを持つことができます。ここに例があります。map はできますが、必須ではありません。データベース ファーストで作業する場合、この暗黙的な動作がデフォルトです。CustomersCustomerGroupCustomerCustomer.CustomerGroups

ただし、CustomerIds のみに関心があるため、通常の 1 対多の関連付けを行うことができますCustomerGroup.CustomerGroupCustomers。このナビゲーション プロパティに対処する場合、必要な結合は 1 つだけで、クエリは非常に軽量です。あなたがCustomerGroupできるインスタンスがある場合

group.CustomerGroupCustomers.Select(c => c.CustomerId)

sのみCustomerIdが照会されます。

Customers必要に応じて、次のようにして直接取得できます

group.CustomerGroupCustomers.Select(c => c.Customer)
于 2012-08-07T08:45:25.547 に答える
0

それを行う新しいプロパティを作成した場合はどうなりますか? edmx を使用している場合はパーシャルを拡張するか、最初にコードを使用している場合はマップされていないものを作成できます。

public class CustomerGroup
{
    public int Id { get; set; }
    public string NAme { get; set; }
    public Customer[] Customers { get; set; }

    public int[] CustomerIds { get { return Customers.Select(c => c.Id).ToArray(); }
}
于 2012-08-06T15:11:19.050 に答える