2013-08-03 4 views
1

У меня есть база данных с четырьмя таблицами. TableA и TableB являются основными таблицами, а TableC - таблицей отношений многих и многих.Как получить активную загрузку во многих отношениях?

  • TableA (IDTableA, имя ...)
  • TableB (IDTableB, имя ...)
  • TableC (IDTableA, IDTableB)

Это создаст три сущности, The EntityA имеет ICollection сущностей C и Entity C имеет коллекцию EntitiesB, поэтому, когда я пытаюсь получить соответствующие объекты я делаю это:

myContext.EntityA.Include(a=>a.EntityB.Select(b=>b.EntityC)); 

Но этот бросок и исключение, в котором говорится, что коллекция имеет значение null.

Так что я хотел бы знать, можно ли выполнить загрузку, когда есть таблица для отношений многих и многих.

Спасибо.

+0

Что лет точно хотите? извлечение A? B? ...? – AminSaghi

+0

Я хочу, в ENtityA, все связанные EntityB. Но для этого мне нужно использовать EntityC, то есть объединение между обеими таблицами, becasu EntityA не имеет свойства навигации для EntityB. –

ответ

1

Со многими ассоциациями в Entity Framework вы можете выбирать между двумя реализациями:

  • Таблица соединений (C) является частью концептуальной модели (модель класса), а ассоциации - A—C—B (1-n-1). A не может иметь коллекцию Bs.
  • Таблица соединений не является частью концептуальной модели, но платформа Entity Framework использует ее прозрачно, чтобы поддерживать связь A—B (n-m). A имеет набор Bs и B имеет коллекцию As. Это возможно только в том случае, если таблица C содержит только две колонки FK для A и B.

Таким образом, вы не можете иметь оба.

Вы (видимо) выбрали первый вариант, так что вы всегда должны запрашивать другие entites через C, как

from a in context.As 
select new { a, Bs = a.Cs.Select(c => c.B) } 

или

from a in As.Include(a1 => a1.Cs.Select(c => c.B)) 
2

Я думаю, что вам это нужно:

var q = myContext.EntityC.Include("EntityA").Include("EntityB").ToList(); 

Если вы хотите Bs из A:

var aId; // = something...; 

var bs = from c in q 
        where c.EntityAId == aId 
        select c.EntityBId; 

И просто наоборот, если вам нужно, как из B:

var bId; // = something...; 

var eas = from c in q 
        where c.EntityBId == bId 
        select c.EntityAId; 
Смежные вопросы