实体框架代码优先:多对多关系。比通常情况更复杂

时间:2014-02-10 23:17:15

标签: c# entity-framework ef-code-first many-to-many

大家好,感谢您花时间阅读我的问题。

我有以下3个POCO:Menu,ApplicationRole和Action。

这些POCO中的每一个都有2个属性ID和描述。

菜单与ApplicationRole有多对多关系,与Action有多对多关系,定义如下:

modelBuilder.Entity<Menu>().HasMany(t => t.Roles).WithMany(p => p.Menus).Map(m => { m.MapLeftKey("MenuId"); m.MapRightKey("RoleId"); m.ToTable("MenuRoles"); }); 

modelBuilder.Entity<Menu>().HasMany(t => t.Actions).WithMany(p => p.Menus).Map(m => { m.MapLeftKey("MenuId"); m.MapRightKey("ActionId"); m.ToTable("MenuActions"); });

到目前为止非常标准。现在,我需要创建一个权限表来将菜单,角色和操作映射到一起。我可以通过创建实体权限轻松实现,如下所示:

public class Permission
{
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid MenuId { get; set; }
    [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid ActionId { get; set; }
    [Key, Column(Order = 2), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string RoleId { get; set; }

    [ForeignKey("MenuId")]
    public virtual Menu Menu { get; set; }

    [ForeignKey("ActionId")]
    public virtual Action Action { get; set; }

    [ForeignKey("RoleId")]
    public virtual ApplicationRole Role { get; set; }
}

但是,这样做会创建具有单个POCO实体的外键,而不是与MenuActions和MenuRoles关联。有没有办法创建这种关系,而无需显式创建MenuActions和MenuRoles实体。

我可以使用流畅的API或注释,但如果可能的话,我更喜欢基于注释的解决方案。

提前感谢您的帮助!

0 个答案:

没有答案