自定义类标识/实体框架多对多关系



我在c#中使用实体框架,Asp.net Identity和MVC来创建我的网站。

尝试实现"组"功能我一直面临一个问题......我实现了临时(基于此:首先创建代码,多对多,关联表中有其他字段):

public class ApplicationUser : IdentityUser
{
    [...]
    public virtual List<Group> Groups { get; set; }
}

和:

public class Group
{
    public int GroupID { get; set; }
    [Required]
    [StringLength(100, MinimumLength = 2)]
    public string Name { get; set; }
    public virtual List<ApplicationUser> Members { get; set; }
}

以及具有额外属性(状态)的链接类:

public class ApplicationUserGroup
{
    [Key, Column(Order = 0)]
    public string ApplicationUserId { get; set; }
    [Key, Column(Order = 1)]
    public int GroupId { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set;}
    public virtual Group Group { get; set; }
    // 1 : simple member
    // 2 : administrator
    public int Status { get; set; }
    public ApplicationUserGroup()
    {
        Status = 1;
    }
}
我设法将我的表作为应用程序用户组

放入我的数据库,但实体不断生成另一个表组应用程序用户没有我的状态字段......

我相信问题来自身份,有人可以帮助我吗?

PS:对不起我的英语,我是法语^^

需要使用适当的属性修饰实体属性,或使用流畅的 API 使 EF 了解你尝试执行的操作。因此,在DbContext类中使用流畅的 api,您应该覆盖OnModelCreating方法。然后使用以下代码:

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<ApplicationUser>()
        .HasMany(au => au.Groups)
        .WithMany(grp => grp.Members)
        .Map(m =>
        {
            m.ToTable("ApplicationUserGroup");
            m.MapLeftKey("ApplicationUserId");
            m.MapRightKey("GroupId");
        });
}

这会告知 EF 将ApplicationUserGroup实体/表用作多对多关系的联结表。

根据您提供的链接,仅当您让 EF 将联接表本身作为隐藏表处理时,上述解决方案才有效。您不能将其包含在模型中。因此,正确的解决方案是对联接表使用两个一对多关系,在这种情况下,这些关系可以存在于模型中。

首先更改实体类,如下所示:

public class ApplicationUser : IdentityUser
{
    [...]
    public virtual List<ApplicationUserGroup> UserGroups { get; set; }
}
public class Group
{
    [Key] // *** add this attribute
    public int GroupId { get; set; } // *** Change D to d to match ApplicationUserGroup property (this is just to be consistent in your naming conventions!)
    [Required]
    [StringLength(100, MinimumLength = 2)]
    public string Name { get; set; }
    public virtual List<ApplicationUserGroup> UserGroups { get; set; } // *** this has changed also
}

然后,若要使用流畅的 API 配置这些关系,请在 DbContext 类中添加以下代码:

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<ApplicationUser>()
            .HasMany(au => au.UserGroups)
            .WithRequired(ug => ug.ApplicationUser)
            .HasForeignKey(ug => ug.ApplicationUserId)
            .WillCascadeOnDelete(false);
    mb.Entity<Group>()
            .HasMany(grp => grp.UserGroups)
            .WithRequired(ug => ug.Group)
            .HasForeignKey(ug => ug.GroupId)
            .WillCascadeOnDelete();
}

在这种情况下,要在组中添加用户,您需要ApplicationUserGroup表中添加一条记录,告知哪个用户添加到哪个组中(使用ApplicationUserId列和GroupId列),并且另外要检查用户是否属于哪些组,您需要选择ApplicationUserGroup中其ApplicationUserId列与该用户的 Id 匹配的所有记录。

希望这有帮助。

最新更新