EF4 - 自我跟踪实体和继承和急切加载

时间:2010-11-04 05:50:30

标签: entity-framework-4

我知道之前已经通过多种方式询问过这个问题但是没有一个答案适用于我 - 或者说是正确的 - 或者是最新的,所以我会再试一次。

我有一个包含多个继承实体的大型模型。一个示例是包含TimetableEvents集合的时间表。 TimetableEvent有几种子类型,例如InterviewTimetableEvent,BreakTimetableEvent和ExercisetimeTableEvent。 ExerciseTimetableEvent与Exercise实体有关系。

我需要使用自我跟踪实体,因为我正在使用WCF后端以无状态方式向几个WPF客户端提供数据。

所以,我需要急切加载所有内容,我认为自我跟踪实体会自动执行此操作,但看起来他们不会。

所以,为了得到一个时间表,我需要做这样的事情:

            var tt = (from s in ESSDataContainer.Timetables
                   .Include("TimetableEvents")
                  where s.TimetableId == timetableid
                  select s).FirstOrDefault();

这将为我提供TimetableEvents,但不提供与ExerciseTimetableEvents相关的练习。我没有运气就尝试了以下(以及其他一些建议):

            var tt = (from s in ESSDataContainer.Timetables
                   .Include("TimetableEvents")
                   .Include("ExerciseTimetableEvents.Exercise")
                  where s.TimetableId == timetableid
                  select s).FirstOrDefault();

有解决方法吗?

如果不是,我将返回正常的上下文跟踪并从本地容器连接到数据库而不是使用WCF。

干杯

2 个答案:

答案 0 :(得分:2)

这有点棘手,但有可能:

var tt = (from s in ESSDataContainer.Timetables
          where s.TimetableId == timetableid
          select new 
          {
              TimeTable = s,
              Events = s.TimeTableEvents,
              Exercise = s.TimeTableEvents.OfType<ExerciseTimetableEvents>()
                                          .Select(ett => ett.Exercise)
          }).Select(s => s.TimeTable)
            .AsEnumerable()
            .FirstOrDefault();

清除泥土,但是,嘿:没有神奇的绳子!此外,它的优点是它实际上有效....

答案 1 :(得分:0)

Microsoft Connect:有一个针对此问题的提案:如果您认为这是值得的,您可以投票支持它。