Entity Framework 4 (запрос Linq не возвращает мои роли) - PullRequest
0 голосов
/ 01 августа 2010

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

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

Пока у меня есть класс с именем User:

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; }
}

и класс с именем Role

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 = "abc@yahoo.com", 
                       Password = "xyz",
                       Roles = new List<Role>
                                   {
                                      roles[0]
                                   }

                       }

        };

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

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

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

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

у них всех есть информация, которая мне нужна, но проблема в том, что я использую следующий запрос LINQ в своем классе репозитория, чтобы получить всех пользователей:

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

        return allUsers;
    }

Теперь, если я проверяю всех пользователей перед тем, как передать его в View, я получаю своих пользователей, но для Role установлено значение 'Null'

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

Ответы [ 2 ]

2 голосов
/ 01 августа 2010

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

2 голосов
/ 01 августа 2010

Вы должны добавить атрибут [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 свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...