Код EF 4.1 Первые множественные отношения «многие ко многим» - PullRequest
4 голосов
/ 06 февраля 2012

У меня проблемы с тем, чтобы обернуть голову вокруг определенных отношений в коде.У меня есть три объекта: группа, пользователь, GroupPermission.Объект GroupPermission содержит информацию о разрешениях, которые относятся к группе.Существует три разрешения: лидер, редактор, пользователь.Таблица GroupPermission должна включать идентификатор первичного ключа и имя разрешения.Затем я хочу таблицу отношений, которая выглядит примерно так: Id - Group_Id - User_Username - GroupPermission_Id.Может быть несколько групп, несколько пользователей, несколько разрешений.У меня есть множество примеров, которые помогают мне составить одну таблицу отношений, но я не могу найти ничего, что включает несколько отношений.

Вот мои сущности ...

Пользователь:

public class User
{
    [Key, StringLength(EntityLength.UsernameLength)]
    public string Username { get; set; }
    [Required, StringLength(EntityLength.NameLength)]
    public string FirstName { get; set; }
    [Required, StringLength(EntityLength.NameLength)]
    public string LastName { get; set; }
    [Required, StringLength(EntityLength.Email)]
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime DateCreated { get; set; }

    public virtual UserPermission UserPermission { get; set; }
    public virtual ICollection<Group> Groups { get; set; }
    public virtual ICollection<Project> Projects { get; set; }
    public virtual ICollection<Issue> Issues { get; set; }
    public virtual ICollection<GroupPermission> GroupPermissions { get; set; } 

    public string FullName
    {
        get { return FirstName + ' ' + LastName; }
    }
}

Группа:

public class Group
{
    [Key]
    public int Id { get; set; }
    [Required, StringLength(EntityLength.GenericLength)]
    public string Name { get; set; }
    [Required, StringLength(EntityLength.DescriptionLength)]
    public string Description { get; set; }

    public virtual ICollection<User> Users { get; set; }
    public virtual ICollection<Project> Projects { get; set; }
    public virtual ICollection<GroupPermission> GroupPermissions { get; set; }
}

GroupPermission:

public class GroupPermission
{
    [Key]
    public int Id { get; set; }
    [StringLength(EntityLength.GenericLength)]
    public string Name { get; set; }

    public int GroupId { get; set; }
    public virtual ICollection<Group> Groups { get; set; }
    public int UserId { get; set; }
    public virtual ICollection<User> Users { get; set; }

    public enum Permission
    {
        Leader = 1,
        Editor = 2,
        User = 3
    }
}

Когда таблицы создаются с использованием этой структуры, я получаю таблицу GroupPermissions с Id, Name, GroupId,и UserId.Эта таблица должна быть только Id и Name.Затем он создает таблицу GroupPermissionUsers, которая содержит GroupPermissions_Id и User_Username.Это таблица, которая должна быть Id, Group_Id, User_Username, GroupPermission_Id.

У кого-нибудь есть какие-либо советы для достижения этой цели, или я думаю о дизайне этого неправильно?

1 Ответ

3 голосов
/ 06 февраля 2012

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

Новый Permission объект с Id и Name:

public class Permission
{
    [Key]
    public int Id { get; set; }
    [StringLength(EntityLength.GenericLength)]
    public string Name { get; set; }

    public virtual ICollection<GroupPermission> GroupPermissions { get; set; }
}  

Модифицированный объект GroupPermission для формирования таблицы соединений среди Users, Groups и Permissions:

public class GroupPermission
{
    [Key]
    public int Id { get; set; }

    public int GroupId { get; set; }
    public virtual Group Group { get; set; }

    public string UserName { get; set; }
    [ForeignKey("UserName")]
    public virtual User User { get; set; }

    public int PermissionId { get; set; }
    public virtual Permission Permission { get; set; }
}
...