ナビゲーション プロパティ
Entity Framework のナビゲーション プロパティは、2 つのエンティティ型間のアソシエーションを操作するための機能です。 ナビゲーション プロパティは、概念モデルの NavigationProperty 要素 (CSDL) で定義します。 各オブジェクトは、参加する各リレーションシップに対してナビゲーション プロパティを持つことができます。 ナビゲーション プロパティを使用すると、リレーションシップ内を両方向に移動して管理し、多重度が 1、またはゼロか 1 の場合にはEntityReference を返し、多重度が多数の場合には EntityCollection を返すことができます。 また、一方向のナビゲーションを選択することもできます。この場合はナビゲーション プロパティを削除できます。詳細については、「How to: Edit and Delete Navigation Properties」を参照してください。
Entity Framework によって生成されたクラスを使用すると、リレーションシップに参加しているオブジェクトに対してナビゲーション プロパティが作成されます。 POCO エンティティのナビゲーション プロパティの使用については、「POCO プロキシの作成要件 (Entity Framework)」を参照してください。
リレーションシップの変更
ナビゲーション プロパティを使用して、リレーションシップを変更できます。 次の例では、Order
オブジェクトの Customer
ナビゲーション プロパティを使用して別の顧客を注文に割り当て、その注文に関連付けられている顧客の参照にアクセスします: order.Customer = customer
次の例では、Orders
ナビゲーション プロパティを使用して注文を既存の顧客に追加し、customer
に属する orders
のコレクションにアクセスします:
customer.Orders.Add(order)
.
外部キーの関連付けでは、次の例に示すように、依存オブジェクトの外部キー プロパティを設定することで、リレーションシップを形成または変更できます。
order.CustomerID = CustomerID
.
独立した関連付けと外部キーの関連付けの詳細については、「リレーションシップの定義と管理 (Entity Framework)」を参照してください。
ナビゲーション プロパティを使用して、定義されているアソシエーションによってエンティティに関連付けられているオブジェクトを読み込むことができます。 詳細については、「関連オブジェクトの読み込み (Entity Framework)」および「ナビゲーション プロパティを使用してリレーションシップをナビゲートする方法 (Entity Framework)」を参照してください。
リレーションシップの操作
次の例では、メソッドベースのクエリ構文で SelectMany メソッドを使用して、姓が "Zhou" である連絡先のすべての注文を取得します。 Contact.SalesOrderHeader ナビゲーション プロパティは、各連絡先の SalesOrderHeader オブジェクトのコレクションを取得するために使用されます。
Dim lastName = "Zhou"
Using context As New AdventureWorksEntities
Dim ordersQuery = context.Contacts _
.Where(Function(c) c.LastName = lastName) _
.SelectMany(Function(o) o.SalesOrderHeaders)
For Each order In ordersQuery
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
order.SalesOrderID, order.OrderDate, order.TotalDue)
Next
End Using
string lastName = "Zhou";
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
IQueryable<SalesOrderHeader> ordersQuery = context.Contacts
.Where(c => c.LastName == lastName)
.SelectMany(c => c.SalesOrderHeaders);
foreach (var order in ordersQuery)
{
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
order.SalesOrderID, order.OrderDate, order.TotalDue);
}
}