私はよくこのSystem.Data.Entity.DbExtensions
Include()
メソッドを使用して、リポジトリからのクエリ結果に複雑なエンティティ フィールドを含めます。ただし、エンティティを新しいクラスに投影すると、含まれている複雑なエンティティ フィールドのこの「具体化」が失われるようです。たとえばEvent
、リポジトリからオブジェクトを返し、複雑なエンティティ フィールドにアクセスできるようにしたいとしAssessment
ます。
public class EventRepository {
...
public IList<Event> GetEvents() {
using (var context = new MyDatabaseContext()) {
return context.Events
.Include(evnt => evnt.ActualAssessment)
.ToList();
}
}
...
}
Include
上記で使用したため、問題なく次のコードを実行できます。
var repoEvents = new EventRepository();
var events = repoEvents.GetEvents();
Console.WriteLine(events[0].ActualAssessment.AssessmentDate.ToString());
しかし、次のように、いくつかの追加情報を使用してEvent
s をラッパー オブジェクトに投影したいとします。ExtendedEvent
public class EventRepository {
...
public IList<ExtendedEvent> GetExtendedEvents() {
using (var context = new MyDatabaseContext()) {
return context.Events
.Include(evnt => evnt.ActualAssessment)
.Select(evnt => new {
TheEvent = evnt,
SomeExtraData = 123
})
.ToList()
.Select(evntInfo => {
return new ExtendedEvent {
TheEvent = evntInfo.TheEvent,
SomeExtraData = evntInfo.SomeExtraData
};
})
.ToList();
}
}
...
}
私は今、このコードを試して実行します:
var repoEvents = new EventRepository();
var extendedEvents = repoEvents.GetExtendedEvents();
Console.WriteLine(extendedEvents[0].TheEvent.ActualAssessment.AssessmentDate.ToString());
これにより、「ObjectContext インスタンスが破棄されたため、接続が必要な操作には使用できなくなりました」というエラーが表示されます。-新しいラッパーオブジェクトに投影したため、 をActualAssessment
使用したにもかかわらず、熱心に読み込まれませんでした。Include
どうすれActualAssessment
ば含まれるようになりますか?