2010-08-01 2 views
0

В настоящее время я работаю над своей собственной версией членства, используя Entity Framework 4.0 и POCO.Entity Framework 4 (запрос Linq не возвращает мои роли)

После подготовки сообщения в блоге Скотта Гуля я решил использовать соглашения как можно больше.

До сих пор у меня есть класс с именем пользователя:

public class User 
{ 
    [System.ComponentModel.DataAnnotations.Key] 
    public int UserId { get; set; } 

    [System.ComponentModel.DataAnnotations.StringLength(60)] 
    public string UserName { get; set; } 

    public string Password { get; set; } 

    [System.ComponentModel.DataAnnotations.ConcurrencyCheck] 
    public string Email { get; set; } 

    [System.ComponentModel.DataAnnotations.Timestamp] 
    public byte[] Timestamp { get; set; } 

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

и класс под названием Роль

public class Role 
{ 
    [System.ComponentModel.DataAnnotations.Key] 
    public int RoleId { get; set; } 

    [System.ComponentModel.DataAnnotations.StringLength(50)] 
    public string RoleName { get; set; } 

    [System.ComponentModel.DataAnnotations.StringLength(300)] 
    public string RoleDescription { get; set; } 

    public ICollection<User> Users { get; set; } 
} 

Я также реализовать DbContext так:

public class BackboneDbContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Role> Roles { get; set; } 
} 

Затем на основе того, что Скотт предложил создать класс Initializer, наследующий от RecreateDatabaseIfModelChanges.

Тогда в этом классе я добавить некоторые фиктивные элементы, как это:

protected override void Seed(BackboneDbContext context) 
    { 
     var roles = new List<Role> 
     { 
      new Role 
       { 
        RoleId = 0, 
        RoleName = "User", 
        RoleDescription = "This role belong to normal users.", 
       } 

     }; 

     roles.ForEach(r => context.Roles.Add(r)); 

     var users = new List<User> 
     { 
      new User {UserId = 1, 
         UserName = "Elham", 
         Email = "[email protected]ahoo.com", 
         Password = "xyz", 
         Roles = new List<Role> 
            { 
             roles[0] 
            } 

         } 

     }; 

     users.ForEach(u => context.Users.Add(u)); 
    } 

Я надеюсь, что это имеет смысл до здесь. Если нет, в основном вышеуказанный код заполняет таблицы фиктивными данными, если изменяется схема базы данных.

до сих пор все абсолютно здорово. Я получаю следующие таблицы:

Роли, Roles_Users и пользователь

все они имеют информацию, мне нужно, но проблема в том, когда я использую следующий LINQ запрос в моем Repository класса, чтобы получить все ПОЛЬЗОВАТЕЛЬ:

public IQueryable<User> GetAllUsers() 
    { 
     IQueryable<User> allUsers = from u in _backboneDbContext.Users select u; 

     return allUsers; 
    } 

теперь, если я проверяю ALLUSERS перед передачей его для просмотра, чтобы мои пользователи, но роль устанавливается в «Null»

Я не знаю, почему ... Есть идеи? Спасибо.

ответ

2

Попробуйте сделать свои объекты ICollection виртуальными. Это позволяет EF выполнять ленивую загрузку отношений. Альтернативно изучите использование метода Include в запросе для активной загрузки связанных объектов.

+0

Спасибо большое, что был правильным ответом, и теперь он работает, я сделал свойства виртуальными! :) Я предпочитаю ленивую загрузку .... – Raha

2

Вы должны добавить атрибут [System.ComponentModel.DataAnnotations.Association]. Например:

public class User 
{ 
    // [...] 

    [System.ComponentModel.DataAnnotations.Association("User_Roles", "UserId", "RoleId")] 
    public ICollection<Role> Roles { get; set; } 
} 

public class Role 
{ 
    // [...] 

    [System.ComponentModel.DataAnnotations.Association("Role_Users", "RoleId", "UserId")] 
    public ICollection<User> Users { get; set; } 
} 

Если ассоциация предназначена быть двунаправленным, вы должны добавить этот атрибут какUser.Roles и Role.Users свойства.

+0

Спасибо за ответ Timwi, Я сделал это, но, к сожалению, он все еще не работает! Я вижу работу ассоциации, когда я добавляю эти тестовые данные, потому что в таблице Roles_Users я получаю связь. но когда я прочитал его, как до того, как я получу значение null для свойства Role! Вы упомянули, что для свойства Users я должен добавить этот атрибут ассоциации, и вы использовали «Role_Users» для первого параметра. что имя таблицы или просто имя. Поскольку я не вижу, что таблица существует в моем списке таблиц, единственная таблица связей, которую я вижу там: Roles_Users ? – Raha

+0

Я считаю, что это просто имя. В Microsoft SQL Server это ограничение внешнего ключа между таблицами получит это имя. – Timwi

+0

Timwi, Я сделал свойства виртуальными, как предложил Wubbsy, и теперь он работает. Спасибо за ваш ответ! :) – Raha

Смежные вопросы