为什么实体框架核心重置填充导航属性为空在adrange期间仅为范围内的第一个项目?



我正在使用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);

…你应该被排序。

相关内容

  • 没有找到相关文章

最新更新