2010-11-04 61 views
0

我知道这已经以几种方式问过,但没有一个答案似乎适用于我 - 或正确 - 或最新,所以我会再试一次。EF4 - 自我跟踪的实体和继承和热切加载

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

我需要使用自我跟踪实体,因为我使用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。

干杯

+0

作为一个简要说明,我只想补充一点,经过多年来多次尝试使数据访问变得简单易行,微软(以及几乎所有其他人)都失败了!这总是比应该更难。这应该是诺贝尔奖......那么我们可能会看到一些真正易用的东西! – Jonesie 2010-11-04 05:54:14

+0

做这样的陈述时要小心,你会在这里引起骚乱。和你的Q一样,我遇到了同样的问题。你不能急于加载派生关系,因为你不知道它的类型。我发现的唯一解决方案是将导航移至父级或2个数据库调用。 – RPM1984 2010-11-04 09:23:13

+1

@ RPM1984查看我的答案,了解没有模式更改或多次调用的解决方案。 – 2010-11-04 14:50:03

回答

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(); 

清除泥浆,但是,嘿:无魔弦!此外,它的优点是它实际上工作....

+0

非常感谢。我现在可以看到这是如何工作的,为什么这是必要的,但是,呃,这很丑陋。我并不热衷于在整个模式中执行此操作,尽管如此我还是恢复了容器跟踪,并将数据层连接到每个客户端的sql,而不是为它提供wcf服务。这是一个耻辱,但预算和时间已经出来解决这个问题了。 – Jonesie 2010-11-04 18:35:17

+0

不错的+1。我已经读了三次,但仍然不明白。 :) @克雷格Stuntz - 你可以看看一个较早的Q我贴:http://stackoverflow.com/questions/4011211/entity-framework-4-abstract-model-how-to-programatically-eager-load-navigationa和看看这是否可以应用于我的?会真的很感激它。我认为我的情况有点棘手。 – RPM1984 2010-11-04 21:13:52

+0

@ RPM1984,我不认为我会这样做,在我不知道什么类型回来的情况下。 – 2010-11-04 21:18:19

0

有一个建议,为此issua在Microsoft Connect:。如果你认为这个有价值的话,你可以投票赞成。