Дозвуковой 3 простых хранилища много ко многим отношениям - PullRequest
0 голосов
/ 15 декабря 2009

Я видел в более раннем посте здесь, на stackoverflow пример отношения многих к многим Чтобы было проще, давайте взглянем на следующие классы:

public class Role(){
    public int Id { get; set; }
    public string Rolename { get; set; }
    public string Description { get; set; }
}

public class User(){
    public int Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public IList<UsersAndRoles> UsersAndRoles { get; set; }
}

public class UsersAndRoles(){
    public int Id { get; set; }
    public User User { get; set; }
    public Role Role { get; set; }
}

Это от руки, так что терпите меня.

Теперь, каков наилучший способ сделать запрос linq для этих классов. Допустим, я хочу получить все роли с привязанными к ним пользователями. Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2009

Ну что ж, так как я хочу содержать свои сущности в чистоте без поиска в базе данных, я не могу сделать это так, как вы предложили.

Я сделал мои сущности такими:

Роль сущности

public class Role(){
    public int RoleId { get; set; }
    public string Rolename { get; set; }
    public string Description { get; set; }
    public IList<User> Users { get; set; }
    public Role()
    {
        RoleId = 0;
        Rolename = "";
        Description = "";
        Users = new List<User>();
    }
}

Пользовательская сущность

public class User(){
    public int UserId { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public User()
    {
        UserId = 0;
        Username = "";
        Password = "";
        Email = "";
    }
}

Пользователи и роли лица

public class UsersAndRoles(){
    public int Id { get; set; }
    public int UserId { get; set; }
    public int RoleId { get; set; }
    public UsersInRoles()
    {
        Id = 0;
        UserId = 0;
        RoleId = 0;
    }
}

Теперь из своего репозитория я пытаюсь сделать следующее:

public IList<Role> GetRolesAndUsers()
{
    //--- Load all roles
    var roles = base.All<Role>();

    //--- Run through all roles and add the users to the roles.
    foreach (var role in roles)
    {
        //--- Load the users in the given role
        var users = (from u in base.All<User>()
                     join ur in base.All<UsersInRoles>() on role.RoleId equals ur.RoleId
                     where u.UserId == ur.UserId
                     select u).ToList();

        //--- Run through the list of users and add the user to the role
        foreach (var user in users)
        {
            role.Users.Add(user);
        }
    }
    //--- Return roles and users
    return roles.ToList();
}

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

Что мне здесь не хватает?

0 голосов
/ 18 декабря 2009

Я никогда не писал linq запросов для такого рода вещей, так как я бы предпочел использовать встроенный репозиторий активных каталогов. Если вы хотите пойти по этому маршруту:

Сначала я должен убедиться, что в вашей базе данных настроены соответствующие внешние ключи:

Table 'Roles'
int Id (PK)

Table 'Users'
int Id (PK)

Table 'UsersAndRoles'
int RoleId (FK)
int UserId (FK)

Если это сделано правильно, Subsonic3 сгенерирует классы для вас, создавая дочерние объекты IQueryable. Если вы хотите, чтобы все роли были привязаны к пользователю, вам также необходимо добавить список UsersAndRoles в объект Role. Вам придется называть это по-другому, поскольку вы не можете назвать его так же, как объект IQueryable :

public partial class Role()
{
    public int Id { get; set; }
    public string Rolename { get; set; }
    public string Description { get; set; }

    private IList<UsersAndRoles> _UserToRoleLinks
    public IList<UsersAndRoles> UserToRoleLinks 
    { 
        get
        {
            if(_UserToRoleLinks == null)
                _UserToRoleLinks = this.UsersAndRoles.ToList();
            return _UserToRoleLinks;
        }
    }
}

public partial class UsersAndRoles
{
    private Role _Role;
    public Role Role
    {
        get
        {
            if (_Role == null)
                _Role = this.Roles.SingleOrDefault();
            return _Role;
        }
        set
        {
            _Role = value;
        }
    }

    private User _User;
    public User User
    {
        get
        {
            if (_User == null)
                _User = this.Users.SingleOrDefault();
            return _User;
        }
        set
        {
            _User = value;
        }
    }
}

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

var roles = Role.All();

для доступа ко всем пользователям для всех ролей:

foreach (var role in roles)
{
    foreach (var userToRoleLink in role.UserToRoleLinks)
    {
        var currentUser = userToRoleLink.User;
    }
}

Конечно, это от руки, поэтому обязательно должны быть ошибки компиляции. Дайте мне знать, если это помогает или нет. Удачи!

...