Сбой контекста первого ассоциированного объекта EF-кода

Не знаю, как правильно это назвать. У меня два объекта в m: n отношениях: член и роль.

public class Role
{
    public int Id { get; set; }
    public string Title { get; set; }

    public ICollection<Member> MembersInRole { get; set; }
}

public class Member
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }

    public ICollection<Role> Roles { get; set; }
}

Я сделал некоторые данные о семени:
http://i56.tinypic.com/2vjvj1w.png

И написал тест:
http://i54.tinypic.com/112916b.png

Проблема заключается в том, что мой член-член не имеет назначенных ролей, даже когда я создал их в контексте (как вы можете видеть на изображениях). Я не знаю, что случилось. Таблицы в базе данных выглядят нормально. Я не уверен, что что-то не так с контекстными экземплярами. Но это должно быть хорошо, потому что я все время работаю с данными семян.

Ответ 1

Попробуйте загрузить роли, включив их явно:

Member admin = db.Members.Include("Roles").FirstOrDefault(m => m.Name == "Admin");

Ответ 2

Свойства навигации MembersRole и Roles не являются виртуальными, поэтому EF не может использовать прокси-сервер для ленивой загрузки. Из-за этого вы должны явно спросить EF, чтобы загрузить ваши свойства навигации. Пометить свойства как виртуальные:

public class Role
{
    public int Id { get; set; }
    public string Title { get; set; }

    public virtual ICollection<Member> MembersInRole { get; set; }
}

public class Member
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
}

Или используйте подход @Yakimych. Желательная загрузка в EF 4.1 также может быть определена с помощью lambdas:

Member admin = db.Members.Include(m => m.Roles)
                         .FirstOrDefault(m => m.Name == "Admin");