0

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とにかく間違っていると感じる任意のプロパティを選択しています)。もっと良い方法はありますか?

4

1 に答える 1

1

このクエリの遅延読み込みを無効にします。そのような状況では、エンティティが取得された後にコンテキストを破棄する場合は役に立ちません。

public IList<OverallEvent> GetEvents() {
    using (var context = new AssessmentSystemContext()) {
        context.Configuration.LazyLoadingEnabled = false;
        return ...
    }
}

EFは、(積極的または明示的な読み込みではなく)プロジェクションを使用したときにコレクションが読み込まれたことを認識せず、コレクションにアクセスするとすぐに遅延読み込みをトリガーする可能性があります。

于 2012-12-14T16:17:06.240 に答える