2012-02-06 130 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