Entity Frameworkでコードファーストのアプローチを使用し、リポジトリパターンを使用してデータベースからエンティティを取得しています。私のデータモデルでは、それぞれOverallEventに多くのEventInConcept子がいます。私のメソッドはsのGetEventsを返し、前述の関係の子は、私の外部(つまり)からアクセスできるように具体化する必要があります。これは私が現在持っているコードです:IListOverallEventDbContextAssessmentSystemContext
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とにかく間違っていると感じる任意のプロパティを選択しています)。もっと良い方法はありますか?