2011-11-15 14 views
0

ObjectContext.AttachおよびObjectSet.Attachは、(データベースに既に存在する)分離エンティティをコンテキストに接続するために使用されます。このようにして、ObjectContext.SaveChangesが呼び出されましたが、EFはこの添付されたエンティティに対して挿入コマンドを送信しようとしません。Entity Framework:EntityCollection.AttachおよびEntityReference.Attachの目的を理解できません

EntityCollection.AttachおよびEntityReference.Attachの目的を理解できません。つまり、既に2種類の方法では、ObjectContextによって既に管理されているエンティティのみを追加できます(EntityStateAddedまたはDetachedに設定したエンティティを追加することはできません)。

そしてObjectContextによって管理エンティティがすでにそれらの関係は、自動的に(すなわちそのEntityReferenceプロパティは、親エンティティを返し、そのEntityCollectionプロパティは、関連子エンティティが含まれています)解決しておりますので、私はまさに私たちがEntityCollection.AttachまたはEntityReference.Attachにを使用することによって獲得なるか理解できませんE1いるため、特定のエンティティE2に関連するエンティティE1を添付するには、すでにObjectContextによってE2自動的に添付されましたか?

はあなたのObjectContextに顧客を持っていて、 顧客の予約することを取得したい場合、あなたは次のように呼び出すことができ、一例として、あなたに

答えて

1

ありがとう:

myCust.Reservations.Load() 

これは、すべてをロードしますその顧客の予約。 しかし、あなたがそれらの予約をフィルタリングする場合は、次のコードに示すように、あなたは、 代わりIN- CreateSourceQueryを使用することができます。

var customer=context.Contacts.OfType<Customer>().First(); 
var sourceQuery = customer.Reservations.CreateSourceQuery() 
        .Where(r => r.ReservationDate > new DateTime(2008, 1, 1)); 
customer.Reservations.Attach(sourceQuery); 

取り付けメソッドが呼び出されたときに、クエリが実行されます。その顧客の予約のサブセットのみがデータベースから検索され、 オブジェクトとして実現されます。

また、CreateSourceQueryを使用して型をフィルタすることもできます。次のコードでは、AttachはEntityReferenceで使用されている ですが、IQueryableは使用されません。代わりに、 オブジェクトに渡す必要があります。このオブジェクトはFirstOrDefaultクエリメソッドを使用して取得できます。 ので、あなたはnullを渡そうとすると、あなたがアタッチ呼び出す前にnullを をテストするために必要な例外がスローされます取り付けます

var addresses = context.Addresses.Take(5); 
foreach (var a in addresses) 
{ 
    var sq = a.ContactReference.CreateSourceQuery() 
      .OfType<Customer>().FirstOrDefault(); 
    if (sq != null) 
    a.ContactReference.Attach(sq); 
} 

このコードでは、顧客のみがロードされます。

+0

こんにちは、私の現在のEFプログラミング経験(これはほとんど存在しない)で、私はCreateSourceQueryをそれほど有用ではありません。 EntityCollection.AttachとEntityReference.Attachは他の状況で役に立ちますか? – user702769

関連する問題