我在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 匹配的所有记录。
希望这有帮助。