Сбой контекста первого связанного объекта EF Code

Не знаю, как правильно назвать это. У меня есть две сущности в отношениях 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

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

2 ответа

Решение

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

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

Ваш 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 также может быть определена с помощью лямбды:

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