문제

나는 (극적으로 단순화 된) EF 계층 구조를 가지고 있습니다.

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; }

다시 말해, 방에는 여러 세션이 포함될 수 있습니다. 각 세션에는 여러 화이트 보드가 포함될 수 있습니다. 각 화이트 보드에는 여러 화이트 보드 셰이프가 포함되어 있습니다. 이러한 모양은 화이트 보드 샤프 폴리 라인을 포함하여 다양한 유형 일 수 있으며, 자체는 여러 폴리 라인 포인트를 포함 할 수 있습니다.

원격 사용자가 처음에 방에 연결되면 전체 객체 그래프를 해당 사용자에게 전달해야하며 데이터베이스에서 해당 그래프를 가능한 한 효율적으로 메모리에로드하는 방법을 알아 내려고합니다.

물론 EF는 다음과 같이 열렬한 적재를 할 수 있습니다.

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

그러나 포함 ()은 폴리 라인 포인트를로드 할 수 없습니다. 구체적으로, 내가 시도하면 :

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

"지정된 포함 경로는 유효하지 않습니다. EntityType 'slidelinc.model.whiteboardshape' 'polylinepoint'라는 이름의 탐색 속성을 선언하지 않습니다."

이 효과도 없습니다 :

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

이것도 그렇지 않습니다 :

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

내가 생각할 수있는 내비게이션 경로를 프레임하는 다른 방법도 없습니다.

내가 결국 확실하게하는 방식 보인다 나에게 해킹처럼 :

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

그것은 작동하지만 내가 원하는 것보다 훨씬 더 많은 코드이며 원하는 것보다 더 많은 데이터베이스 액세스입니다.

내가 찾은 가장 가까운 대답은입니다 여기, 그러나 내 가난한 Linq 별 뇌는 예제 코드를 내가 가진 더 복잡한 계층으로 변환하는 방법을 알 수 없습니다. 또한 해당 링크의 샘플 코드는 추악하고 이해하기 어렵습니다. EF가 내부적으로 계층을 구성하는 방식에 대한 모호하고 보이지 않는 부작용에 따라 내 객체 전체 계층 구조를 원하지 않습니다.

다른 제안이 있습니까?

도움이 되었습니까?

해결책

나는 아마 이것을 위해 투영을 사용할 것입니다. 엔티티 유형을 반환하는 대신 가벼운 데이터 전송 객체 또는 익명 유형으로 프로젝트하십시오. 프로젝트 (예 : LINQ 쿼리를 사용하여)가 로딩이 자동으로 이루어집니다. 이 경우 포함 내용을 지정할 필요가 없습니다.

다른 팁

나는 당신과 비슷한 문제를 겪고 있었고 (더 쉬운 naviagation 경로) Designer.cs 파일의 속성 이름이 내가 기대 한 것이 아니라는 것을 깨달았습니다. 디자이너 파일의 속성 이름으로 변경하면 모두 잘 작동했습니다. 또한 두 가지 다른 경로를 수행했습니다.

.Include("UnexpectedNameA").Include("UnexpectedNameB")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top