我有这个用户的POCO类,其中包含Id和一组RoleUser对象以及其他属性
public class SystemUser : IEntity
{
public int Id { get; set; }
[MaxLength(50)]
[Index("ExternalUserIdIndex",IsUnique = true)]
public string ExternalUserId { get; set; }
public virtual ICollection<RoleUser> UserRoles { get; set; }
}
我的RoleUser类就是这个
public class RoleUser : IEntity
{
public int Id { get; set; }
public int SystemUserId { get; set; }
public virtual Role Role { get; set; }
}
Role类与此问题无关。我有一些种子方法用于添加具有某些角色的默认用户,在添加角色之前我删除了现有角色。我试图做以下事情:
var user = context.SystemUsers.FirstOrDefault(u => u.ExternalUserId == "extId");
正如您所看到的,我的dbContext跟踪了这个实例。然后我先尝试了:
user.UserRoles.Clear();
//add roles
但是我在运行种子方法时得到了这个:
由于一个或多个外键属性不可为空,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
然后我试了
user.UserRoles.ToList().ForEach(r => developerPaco.UserRoles.Remove(r));
得到同样的错误。最后我做了:
user.UserRoles.ToList().ForEach(r=>context.RoleUsers.Remove(r));
它有效。所以我想理解为什么它不起作用。
注意:我通过更改我的RoleUser类来完成前两次尝试,如下所示:
public class RoleUser : IEntity
{
public int Id { get; set; }
public int? SystemUserId { get; set; }
public virtual Role Role { get; set; }
}
制作可以为空的SystemUserId,但是我只是获取具有空值的数据而不是按照我的意愿删除。