组标识多对多关系中的用户,并根据角色限制为资源



我正在尝试首先使用代码设置数据库,以获得以下结果。用户注册到该网站,并使用内置角色成为管理员,并且可以访问单个实例类(使用ApplicationUserInstance(。然后,管理员可以添加另一个管理员/管理员/用户,他们成为同一用户组的一部分,并且也可以访问同一实例。

将有一个更高的角色称为SuperAdmin,他将能够访问多个实例,而不仅仅是像上面那样的一个实例。

到目前为止,我正在添加一个管理员,并创建一个实例fine,然后将管理员分配给该实例。当我尝试创建一个组并将用户分配给该组时,我得到了一个外键错误,如下所示。

我不确定这是实现我所需要的最好的方式,任何帮助都会被感激。感谢

DbContext:

public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Company { get; set; }
public string Telephone { get; set; }
public string Postcode { get; set; }
public virtual ICollection<ApplicationUserInstance> ApplicationUserInstances { get; set; }
public virtual ICollection<UserGroup> UserGroups { get; set; }
}
public class UserGroup
{
public string ApplicationUserId { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
public string GroupId { get; set; }
public virtual Group Group { get; set; }
}
public class Group
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public string GroupId { get; set; }
[MaxLength(50)]
public string Company { get; set; }
public virtual ICollection<UserGroup> UserGroups { get; set; }
}
public class ApplicationUserInstance
{
public string ApplicationUserId { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
public string InstanceId { get; set; }
public virtual Instance Instance { get; set; }
}
public class Instance
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public string InstanceId { get; set; }
[MaxLength(100)]
public string Company { get; set; }
public virtual ICollection<ApplicationUserInstance> ApplicationUserInstances { get; set; }
public virtual ICollection<GSMSite> GSMSites { get; set; }
}
builder.Entity<ApplicationUserInstance>().HasKey(aui => new { aui.ApplicationUserId, aui.InstanceId });
builder.Entity<UserGroup>().HasKey(ug => new { ug.ApplicationUserId, ug.GroupId });

用户服务:

var newInstance = new Instance
{
Company = request.Company
};
var createInstance =  await _dbContext.Instances.AddAsync(newInstance);
var createInstanceUser = await _dbContext.ApplicationUserInstances.AddAsync(new ApplicationUserInstance { ApplicationUserId = newUser.Id, InstanceId = newInstance.InstanceId });
var newGroup = new Group
{
Company = request.Company
};
var createGroup = await _dbContext.Groups.AddAsync(newGroup);
var createUserGroup = await _dbContext.UserGroups.AddAsync(new UserGroup { ApplicationUserId = newUser.Id, GroupId = newGroup.GroupId });
await _dbContext.SaveChangesAsync();

错误:

Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
---> Microsoft.Data.SqlClient.SqlException (0x80131904): The INSERT statement conflicted with the FOREIGN KEY constraint "FK_UserGroups_AspNetUsers_GroupId". The conflict occurred in database "GSMProfile", table "dbo.AspNetUsers", column 'Id'.
The statement has been terminated.

添加以下Fluent API似乎可以完成任务,现在它可以工作了:

builder.Entity<UserGroup>()
.HasOne(c => c.ApplicationUser)
.WithMany(e => e.UserGroups)
.HasForeignKey(c => c.ApplicationUserId);
builder.Entity<UserGroup>()
.HasOne(c => c.Group)
.WithMany(e => e.UserGroups)
.HasForeignKey(c => c.GroupId);

最新更新