Entity Frameworkでコードファーストのアプローチを使用し、リポジトリパターンを使用してデータベースからエンティティを取得しています。私のデータモデルでは、それぞれOverallEvent
に多くのEventInConcept
子がいます。私のメソッドはsのGetEvents
を返し、前述の関係の子は、私の外部(つまり)からアクセスできるように具体化する必要があります。これは私が現在持っているコードです:IList
OverallEvent
DbContext
AssessmentSystemContext
public IList<OverallEvent> GetEvents() {
using (var context = new AssessmentSystemContext()) {
return context.OverallEvents
.Select(evnt => new {
OverallEvent = evnt,
// evnt.EventsInConcept is a public virtual ICollection<EventInConcept>
ConcreteEventsInConcept = evnt.EventsInConcept
})
.AsEnumerable()
.Select(evntData => {
evntData.OverallEvent.EventsInConcept = evntData.ConcreteEventsInConcept.ToList();
// foreach (var eic in evntData.OverallEvent.EventsInConcept) {
// eic.Name = eic.Name;
// }
return evntData.OverallEvent;
})
.ToList();
}
}
OverallEvent
エンティティのリストが返されますが、これは問題ありませんが、子の関係にアクセスしようとするEventsInConcept
とエラーが発生するという問題があります。例えば:
EventRepository repoEvent = new EventRepository();
var gotEvents = repoEvent.GetEvents();
var firstEventInConcept = gotEvents[0].EventsInConcept.FirstOrDefault();
...「ObjectContextインスタンスが破棄され、接続を必要とする操作に使用できなくなりました」というエラーが表示されます。
以前の質問への回答から、ラッパーオブジェクトに投影EventsInConcept
し、後の.Select
呼び出し(つまりevntData.OverallEvent.EventsInConcept = evntData.ConcreteEventsInConcept.ToList();
)で明示的に設定すると、これが具体化されることを理解しました:多くの関係と、EventsInConcept
の外部にアクセスできるようになりますDbContext
。しかし、ここでは機能していません。ループのコメントを外すと、foreach
ループが機能し始めるので、ループを機能させるには、のすべてのエントリにプロパティを明示的に設定する必要があることに注意してくださいEventsInConcept
。私は本当にこれをする必要はありません(.Name
とにかく間違っていると感じる任意のプロパティを選択しています)。もっと良い方法はありますか?