C# Nhibernate';具有相同标识符值的不同对象';问题
我有一个更新用户实体的计划进程。此用户实体与角色对象有多人多的关系C# Nhibernate';具有相同标识符值的不同对象';问题,c#,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Fluent Nhibernate Mapping,我有一个更新用户实体的计划进程。此用户实体与角色对象有多人多的关系 public class UserMappingOverride : IAutoMappingOverride<User> { public void Override(AutoMapping<User> mapping) { mapping.HasManyToMany(u => u.Roles) .Access.ReadOnlyPrope
public class UserMappingOverride : IAutoMappingOverride<User>
{
public void Override(AutoMapping<User> mapping)
{
mapping.HasManyToMany(u => u.Roles)
.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.None)
.AsSet()
.Cascade.SaveUpdate();
}
}
…和用户(省略不相关的部分):
当流程运行时,它会成功地运行到某一点,之后循环的每个后续迭代都会产生以下结果:
NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 0, of entity: MyProject.Core.Domain.UserRole
at NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj)
所以问题是-为什么这个错误只会在某一点之后发生,我能做些什么来解决它?我见过Merge在类似的问题上提到过这种类型的问题——这在这里适用吗?也许只是一个提示
我在这里看到的要点是:
- 现在有了角色对象(只有一些
)enum
- 因此,没有多对多
public class User : Entity
{
ISet<UserRole> _roles = new HashSet<UserRole>();
public virtual ISet<UserRole> Roles
{
get { return _roles }
}
...
}
它可以映射为HasMany(一对多)
现在它应该可以工作了,我们只需要分配两端
userRole.User = user;
user.Roles.Add(userRole);
能否显示您的实体和两个集合的映射(如果有UserRole实体,则显示所有三个集合)@RadimKöhler添加了UserRole实体和用户实体的相关部分我不理解UserRole(EnumEntity)。它是用户和角色之间的配对对象吗?它是否具有属性
User-User{get;set;}
和Role-Role{get;set;}
?@RadimKöhler有一个UserRoleToUser表,该表保存针对用户的实际角色枚举(即该表有两列:UserFk和UserRoleFk)。我们正在使用AutoMap,我认为这个表是通过一个级联(ConventionBuilder.HasManyToMany.Always(r=>r.Cascade.All())填充的,这就是我的观点。。。如果有多对多(并将表与FK配对),我们就没有内部对象在起作用。。。无UserRole
。只要用户
拥有角色
集合,角色
集合就可以拥有用户
。。。
NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 0, of entity: MyProject.Core.Domain.UserRole
at NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj)
public class User : Entity
{
ISet<UserRole> _roles = new HashSet<UserRole>();
public virtual ISet<UserRole> Roles
{
get { return _roles }
}
...
}
public class UserRole : Entity
{
public virtual User User { get; set; }
public RoleEnum Role { get; set; }
}
mapping.HasMany(u => u.Roles)
...
.AsSet()
.Inverse()
.Cascade.SaveUpdate();
userRole.User = user;
user.Roles.Add(userRole);