Łącznie z właściwościami nawigacji z klas TPH Entity Framework

Mam hierarchię EF, która (znacznie uproszczona) wygląda mniej więcej tak:

class Room { EntityCollection<Session> Sessions; }
class Session { EntityCollection<Whiteboard> Whiteboards; EntityReference Room; }
class Whiteboard { EntityCollection<WhiteboardShape> WhiteboardShapes; EntityReference Session; }
abstract class WhiteboardShape { EntityReference Whiteboard; }
class WhiteboardShapeEllipse : WhiteboardShape { }
class WhiteboardShapePolyline { WhiteboardShape { EntityCollection<PolylinePoint> PolylinePoints }
class PolylinePoint { EntityReference<WhiteboardShapePolyline> WhiteboardShapePolylineReference; }

Innymi słowy, Pokój może zawierać wiele sesji; każda sesja może zawierać wiele tablic; a każda tablica może zawierać wiele kształtów białej tablicy. Te kształty mogą być różnych typów, w tym WhiteboardShapePolyline, która sama może zawierać wiele punktów PolylinePoints.

Kiedy zdalny użytkownik początkowo łączy się z pokojem, muszę przekazać cały wykres obiektu temu użytkownikowi i próbuję dowiedzieć się, jak załadować ten wykres z bazy danych do pamięci tak efektywnie, jak to możliwe.

Teraz, oczywiście, EF pozwala Ci robić chętne ładowanie, tak:

      Room room = ctx.Room
            .Include("Sessions.Whiteboards")
            .FirstOrDefault(r => r.OwnerID == ownerUserID && r.Name == roomName);

Ale Include () nie pozwala mi załadować PolylinePoints. W szczególności, jeśli spróbuję:

        Room room = ctx.Room
            .Include("Sessions.Whiteboards.WhiteboardShape.PolylinePoint")
            .FirstOrDefault(r => r.OwnerID == ownerUserID && r.Name == roomName);

Otrzymuję wyjątek „Określona ścieżka Include nie jest poprawna. EntityType„ SlideLinc.Model.WhiteboardShape ”nie deklaruje właściwości nawigacji o nazwie„ PolylinePoint ”.”

Nie działa to również:

.Include("Sessions.Whiteboards.WhiteboardShapePolyline.PolylinePoint")

Nie robi to również:

.Include("Sessions.Whiteboards.WhiteboardShape.WhiteboardShapePolyline.PolylinePoint")

Ani żadnego innego sposobu określania ścieżki nawigacji, o której myślę.

Sposób, w jaki to skończyłemwydaje się jak dla mnie hack:

        // Make sure we've got everything loaded.
        if (room != null)
        {
            if (!room.Sessions.IsLoaded) { room.Sessions.Load(); }
            foreach (Session session in room.Sessions)
            {
                if (!session.Whiteboards.IsLoaded) { session.Whiteboards.Load(); }
                foreach (Whiteboard whiteboard in session.Whiteboards)
                {
                    if (!whiteboard.WhiteboardShape.IsLoaded) { whiteboard.WhiteboardShape.Load(); }
                    foreach (WhiteboardShape shape in whiteboard.WhiteboardShape)
                    {
                        if (shape is WhiteboardShapePolyline)
                        {
                            WhiteboardShapePolyline polyline = (WhiteboardShapePolyline)shape;
                            if (!polyline.PolylinePoints.IsLoaded) { polyline.PolylinePoints.Load(); }
                        }
                    }
                }
            }
        }

Działa, ale jest o wiele więcej kodu, niż chcę, i to jest cała masa dostępu do baz danych, niż chcę.

Najbliższa odpowiedź, jaką znalazłem, totutaj, ale mój biedny wygłodzony mózg z Linq nie wie, jak przetłumaczyć przykładowy kod na bardziej skomplikowaną hierarchię, którą mam; Ponadto przykładowy kod tego linku jest cholernie brzydki i trudny do zrozumienia. Naprawdę nie chcę mojej całej hierarchii obiektów w zależności od niejasnego i niewidocznego efektu ubocznego tego, jak EF wewnętrznie konstruuje swoje hierarchie.

Jakieś inne sugestie?

questionAnswers(2)

yourAnswerToTheQuestion