2012-02-06 128 views
4

我在绕过某个代码优先关系时遇到了麻烦。我有三个实体:Group,User,GroupPermission。 GroupPermission实体拥有关于与组相关的权限的信息。有三种权限:领导,编辑,用户。 GroupPermission表应该包含主键ID和权限的名称。然后我想要一个关系表,如下所示:Id - Group_Id - User_Username - GroupPermission_Id。可以有多个组,多个用户,多个权限。我有很多帮助我创建单个关系表的示例,但找不到包含多个关系的任何内容。EF 4.1代码首先多个多对多关系

这里是我的实体...

用户:

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

当采用这种结构创建的表,我得到一个Gro具有Id,Name,GroupId和UserId的upPermissions表。此表只需要Id和Name。然后它创建一个GroupPermissionUsers表,其中包含GroupPermissions_Id和User_Username。这是应该是Id,Group_Id,User_Username,GroupPermission_Id的表。

有没有人有任何提示,以完成这个或我想这不正确的设计?

回答

3

在这种情况下,您缺少额外的实体。它应该看起来像:

Permission实体IdName

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实体,形成结表中UsersGroupsPermissions

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

我写了这个确切的(以这封信)解决方案进入我的项目,你提交这个,它似乎工作。我试图做到这一点,而没有额外的实体认为它可以完成,我错了。谢谢你确认我的怀疑。我以为我错过了一些东西,但是我花了多次谷歌搜索和一个周末才让它打我。 – snoluet 2012-02-06 18:03:24