EntityReference を使用してオブジェクト間のリレーションシップを変更する方法 (Entity Framework)
このトピックでは、EntityReference オブジェクトを使用して、オブジェクト コンテキストで 2 つのオブジェクト間のリレーションシップを変更する方法について説明します。 SaveChanges メソッドが呼び出されると、リレーションシップの変更は、関連付けられているテーブルの外部キーに対する変更としてデータベースに保存されます。 詳細については、「方法: アソシエーションの変更時にビジネス ロジックを実行する」を参照してください。
このトピックの例には、Adventure Works Sales Model が使用されています。このトピックのコードを実行するには、あらかじめプロジェクトに Adventure Works Sales Model を追加し、Entity Framework を使用するようにプロジェクトを構成しておく必要があります。詳細については、「Entity Data Model ウィザードを使用する方法 (Entity Framework)」、または「Entity Framework プロジェクトを手動で構成する方法」、および「Entity Data Model を手動で定義する方法 (Entity Framework)」を参照してください。
例
この例では、EntityReference オブジェクトを使用して、SalesOrderHeader オブジェクトと、関連付けられている注文の出荷先住所を表す Address オブジェクトとのリレーションシップを変更する方法を示します。
' Define the order and new address IDs.
Dim orderId As Integer = 43669
Dim addressId As Integer = 26
Using context As New AdventureWorksEntities()
' Get the billing address to change to.
Dim address As Address = context.Addresses.Single(Function(c) c.AddressID = addressId)
' Get the order being changed.
Dim order As SalesOrderHeader = context.SalesOrderHeaders.Single(Function(o) o.SalesOrderID = orderId)
' You do not have to call the Load method to load the addresses for the order,
' because lazy loading is set to true
' by the constructor of the AdventureWorksEntities object.
' With lazy loading set to true the related objects are loaded when
' you access the navigation property. In this case Address.
' Write the current billing street address.
Console.WriteLine("Current street: " & order.Address.AddressLine1)
' Change the billing address.
If Not order.Address.Equals(address) Then
' Use Address navigation property to change the association.
order.Address = address
' Write the changed billing street address.
Console.WriteLine("Changed street: " & order.Address.AddressLine1)
End If
' If the address change succeeds, save the changes.
context.SaveChanges()
' Write the current billing street address.
Console.WriteLine("Current street: " & order.Address.AddressLine1)
End Using
// Define the order and new address IDs.
int orderId = 43669;
int addressId = 26;
using (AdventureWorksEntities context
= new AdventureWorksEntities())
{
// Get the billing address to change to.
Address address =
context.Addresses.Single(c => c.AddressID == addressId);
// Get the order being changed.
SalesOrderHeader order =
context.SalesOrderHeaders.Single(o => o.SalesOrderID == orderId);
// You do not have to call the Load method to load the addresses for the order,
// because lazy loading is set to true
// by the constructor of the AdventureWorksEntities object.
// With lazy loading set to true the related objects are loaded when
// you access the navigation property. In this case Address.
// Write the current billing street address.
Console.WriteLine("Current street: "
+ order.Address.AddressLine1);
// Change the billing address.
if (!order.Address.Equals(address))
{
// Use Address navigation property to change the association.
order.Address = address;
// Write the changed billing street address.
Console.WriteLine("Changed street: "
+ order.Address.AddressLine1);
}
// If the address change succeeds, save the changes.
context.SaveChanges();
// Write the current billing street address.
Console.WriteLine("Current street: "
+ order.Address.AddressLine1);
}
参照
処理手順
方法: 外部キーのプロパティを使用してオブジェクト間のリレーションシップを変更する
方法: アソシエーションの変更時にビジネス ロジックを実行する
概念
オブジェクトの使用 (Entity Framework)
リレーションシップの定義と管理 (Entity Framework)