我有 2 个实体用户和角色,它们的映射如下:
accountSet.HasMany(x => x.Roles).WithMany(x => x.Users).Map(t =>
{
t.ToTable("UserRole");
t.MapLeftKey("UserId");
t.MapRightKey("RoleId");
});
我正在尝试更新用户(通过添加新的 UserRole)
var rolesForUser = UnitOfWork.UserRoleService.FindEntitiesByFilter(...);
user.Roles.Clear();
foreach (var role in rolesForUser)
user.Roles.Add(role)
在役:
AttachCollections(entity);
_entityRepository.Update(entity);
附加集合:
private void AttachCollections(EntityBase entity)
{
var result = new List<IEnumerable<EntityBase>>();
foreach (var prop in entity.GetType().GetProperties())
{
if (typeof(IEnumerable<EntityBase>).IsAssignableFrom(prop.PropertyType))
{
var get = prop.GetGetMethod();
if (!get.IsStatic && get.GetParameters().Length == 0 && get.IsVirtual)
{
var enumerable = (IEnumerable<EntityBase>)get.Invoke(entity, null);
if (enumerable != null) result.Add(enumerable);
}
}
}
foreach (var collection in result)
{
foreach (var r in collection)
{
var collectionType = r.GetType();/
_dbContext.Set(collectionType).Attach(r);
}
}
}
...UnitOfWork.Commit()
我收到错误“AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 AcceptChanges 之前确保键值是唯一的。
如果我删除 ApplyCollection,我会收到无法插入具有 id 的重复用户的错误。似乎 UserRole 被标记为已添加状态。如果更改此状态,则用户(用户角色包含)也标记为已添加。