【问题标题】:EF 4.1 Code First multiple Many-to-Many relationshipsEF 4.1 Code First 多对多关系
【发布时间】:2012-02-06 16:26:39
【问题描述】:

我很难理解某种代码优先关系。我有三个实体:Group、User、GroupPermission。 GroupPermission 实体保存有关与组相关的权限的信息。共有三种权限:leader、editor、user。 GroupPermission 表应包括主键 ID 和权限名称。然后我想要一个看起来像这样的关系表: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; }
}

组权限:

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。然后它创建一个包含 GroupPermissions_Id 和 User_Username 的 GroupPermissionUsers 表。这是应该是 Id、Group_Id、User_Username、GroupPermission_Id 的表。

是否有人有任何提示来完成此操作,或者我是否在考虑错误的设计?

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4.1 ef-code-first


    【解决方案1】:

    在这种情况下,您会缺少其他实体。它应该看起来像:

    带有IdName 的新Permission 实体:

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

    【讨论】:

    • 在您提交此文件时,我将这个确切的(按字母顺序)解决方案写入了我的项目,它似乎正在工作。我试图在没有额外实体认为可以完成的情况下做到这一点,但我错了。谢谢你证实了我的怀疑。我以为我错过了一些东西,但我花了多次谷歌搜索和一个周末才发现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多