我正在使用asp.net Identity库,我已经自定义了IdentityUser
有一个自定义的导航属性称为CompanyRole
类型的ApplicationRole
这里是下面的大致结构
public class ApplicationUser: IdentityUser
{
...
public ApplicationRole CompanyRole { get; set }
}
public class ApplicationRole : IdentityRole
{
public string Id{ get; set; }
public string Name { get; set; }
}
ApplicationUser
模型配置片段
builder
.HasOne(x => x.CompanyRole)
.WithOne()
.HasForeignKey<ApplicationUser>(au => au.CompanyRoleId)
.OnDelete(DeleteBehavior.Restrict);
所以当我尝试添加多个用户与现有的角色,像这样
var viewerRole = await _rolesService.GetViewerRole() // it queries role from dbcontex behind the scene, so it should be tracked
var usersToAdd = emails.Select(email => new ApplicationUser
{
FirstName = request.Name,
Email = email,
CompanyRole = viewerRole
}
)
_dbContext.Set<ApplicationUser>().AddRange(usersToAdd)
_dbContext.SaveChanges();
它抱怨不能在CompanyRoleId列中插入NULL,因为它是一个FK约束。
这个异常的原因是范围内的第一个用户获得CompanyRole为null,而其他用户则是好的。既然观众角色应该被跟踪,为什么会发生这种情况?
我试着玩实体状态,如添加和附加实体再次-没有运气
我期望所有用户都是参照现有的ApplicationRole
创建的
顺便说一句,工作的解决方案是,如果我拆分用户一个接一个地添加细微的变化,并立即分离它们,那么它就工作了,缺点是每个用户的查询…效率低下
var result = _dbContext.Set<ApplicationUser>().Add(user);
await _dbContext.SaveChangesAsync();
_dbContext.Entry(user).State = EntityState.Detached;
问题是您正在将用户和公司角色之间的关系定义为一对一。这意味着任何1公司角色只能分配给一个用户。因此,当它尝试将角色与每个用户关联时,它将与前一个用户解除关联。
看起来您想要的是多对一,许多用户可以拥有相同的角色。将映射调整为:
builder
.HasOne(x => x.CompanyRole)
.Withmany()
.HasForeignKey<ApplicationUser>(au => au.CompanyRoleId)
.OnDelete(DeleteBehavior.Restrict);
…你应该被排序。