Code First MVC 4 EF 5 Соединение «многие ко многим»

Я боролся с этим в течение последних нескольких дней и не могу понять это. Я использую подход Code First с MVC 4 и EF 5. У меня есть настройка отношений «многие ко многим» через свободный API. Вот пример кода:

    public class Class
    {
        public Class()
        {
            Teachers = new List<User>();
        }
        /// <summary>
        /// Unique ID in the system
        /// </summary>
        [Key]
        public long Id { get; set; }

        /// <summary>
        /// Array of users (Teachers and Interventionists) associated with that class
        /// </summary>
        public List<User> Teachers { get; set; }
    }

Класс пользователя:

public class User
{
    public User()
    {

    }
    /// <summary>
    ///     Unique Id in the system 
    ///</summary> 
    [Key]
    public long Id { get; set; }

    public List<Class> Classes { get; set; }
}

Свободный API здесь:

    modelBuilder.Entity<Class>().HasMany(m => m.Teachers).WithMany(t => t.Classes).Map(m =>
            {
                m.ToTable("ClassTeachers");
                m.MapLeftKey("ClassId");
                m.MapRightKey("UserId");
            });

В чем дело:

EF создает таблицу ClassTeachers, и когда я выбираю все классы, я получаю данные, как и ожидалось. Классы имеют правильных Учителей в возвращаемых данных.

В чем мне нужна помощь:

Я пытаюсь вернуть все классы, у которых есть конкретный учитель. Я пытался что-то вроде этого:

    var classesTeachers =
        from classes in data.Classes from u in data.Users
        where u.Id == mockUser.Id
        select new { classes.Id, classes.Label, u.FirstName };

Однако я не получаю назад правильные данные. Обычно была бы третья таблица, к которой я мог бы присоединиться, чтобы получить требуемые результаты, однако это недоступно с подходом EF Code First. Я действительно в растерянности...

Спасибо.


person user1038280    schedule 30.08.2012    source источник


Ответы (1)


Попробуй это:

var classesTeachers = from c in data.Classes
                      where c.Teachers.Any(t => t.Id == mockUser.Id)
                      select c;
person Ladislav Mrnka    schedule 30.08.2012