EntityCollection<TEntity>.Load(MergeOption) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
指定したマージ オプションを使用して、関連オブジェクトをコレクションに読み込みます。
public:
override void Load(System::Data::Objects::MergeOption mergeOption);
public override void Load (System.Data.Objects.MergeOption mergeOption);
override this.Load : System.Data.Objects.MergeOption -> unit
Public Overrides Sub Load (mergeOption As MergeOption)
パラメーター
- mergeOption
- MergeOption
このコレクション内のオブジェクトを、同じ ObjectContextに対して以前のクエリから返された可能性があるオブジェクトとマージする方法を指定します。
例
この例は、Adventure Works Sales Model に基づいています。 この例のコードを実行するには、AdventureWorks Sales Model をプロジェクトに既に追加し、Entity Framework を使用するようにプロジェクトを構成している必要があります。 これを行うには、「方法: Entity Framework プロジェクトの を手動で構成し、方法を する: モデル ファイルとマッピング ファイルを手動で定義する」の手順を完了します。
次の使用例は、Contact
エンティティの関連する SalesOrderHeader
オブジェクトを読み込みます。
// Specify the customer ID.
int contactID = 4332;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
context.ContextOptions.LazyLoadingEnabled = false;
// Get a specified customer by contact ID.
var contact =
(from c in context.Contacts
where c.ContactID == contactID
select c).First();
// Load the orders for the customer explicitly.
if (!contact.SalesOrderHeaders.IsLoaded)
{
contact.SalesOrderHeaders.Load();
}
foreach (SalesOrderHeader order in contact.SalesOrderHeaders)
{
// Load the items for the order if not already loaded.
if (!order.SalesOrderDetails.IsLoaded)
{
order.SalesOrderDetails.Load();
}
Console.WriteLine(String.Format("PO Number: {0}",
order.PurchaseOrderNumber));
Console.WriteLine(String.Format("Order Date: {0}",
order.OrderDate.ToString()));
Console.WriteLine("Order items:");
foreach (SalesOrderDetail item in order.SalesOrderDetails)
{
Console.WriteLine(String.Format("Product: {0} "
+ "Quantity: {1}", item.ProductID.ToString(),
item.OrderQty.ToString()));
}
}
}
注釈
このメソッドは、コレクションを読み込む前に内部 RelatedEnd.ValidateLoad
メソッドを呼び出します。これにより、Load の呼び出しに正しい条件があることを検証します。
RelatedEnd.ValidateLoad
メソッドでは、次のことが確認されます。
- 有効な ObjectContext が存在します。
- エンティティが Deleted 状態ではありません。
- ソース エンティティが NoTrackingされた場合にのみ、Load の MergeOption を NoTracking する必要があります。 ソース エンティティが他の MergeOptionを使用して取得された場合、LoadMergeOption は NoTracking 以外の任意の場合があります (たとえば、エンティティが OverwriteChanges で読み込まれ、Load オプションを AppendOnlyできます)。
-
mergeOption
が NoTrackingされている場合、Load は既に読み込まれているエンティティで呼び出されず、Load は空ではない追跡されていない RelatedEndで呼び出されません。
コレクション内のオブジェクトが既に ObjectContextに読み込まれている場合、Load メソッドは、mergeOption
パラメーターで指定された MergeOption を適用します。 詳細については、「ID 解決、状態管理、および変更追跡を参照してください。
関連するオブジェクトを明示的に読み込むには、ナビゲーション プロパティによって返される関連する末尾で Load
メソッドを呼び出す必要があります。 一対多リレーションシップの場合は、EntityCollection<TEntity>で Load メソッドを呼び出します。 一対一リレーションシップの場合は、EntityReference<TEntity>の Load を呼び出します。 これにより、関連するオブジェクト データがオブジェクト コンテキストに読み込まれます。 返された結果のコレクションを列挙するには、foreach
ループ (Visual Basic のFor Each...Next
) を使用し、結果内の各エンティティの EntityReference<TEntity> プロパティと EntityCollection<TEntity> プロパティに対して Load
メソッドを条件付きで呼び出すことができます。
Load メソッドは、IsLoaded が true
かどうかに関係なく、データ ソースから関連オブジェクトを読み込みます。
手記
foreach
(C#) または For Each
(Visual Basic) 列挙中に Load メソッドを呼び出すと、Object Services は新しいデータ リーダーを開こうとします。 接続文字列で multipleactiveresultsets=true
を指定して、複数のアクティブな結果セットを有効にしていない限り、この操作は失敗します。 クエリの結果を List<T> コレクションに読み込むこともできます。 これにより、データ リーダーが閉じられ、コレクションを列挙して参照先オブジェクトを読み込むことができます。
EntityCollection<TEntity>.Load メソッドは、EntityReference<TEntity>.Load メソッドと同期されます。
適用対象
.NET