C# NHibernate并将具有复合集合的新项目添加到子集合
我有三门课,在尝试添加一个新孩子时会出现问题 它们是:C# NHibernate并将具有复合集合的新项目添加到子集合,c#,nhibernate,hibernate,C#,Nhibernate,Hibernate,我有三门课,在尝试添加一个新孩子时会出现问题 它们是: User { List attributesGroup> } AttributesGroup { attributesGroupId value } AttributesGroupId { attrName userId } 映射为: <class name="AlternativeUserAttributes" table="`AlternativeUser
User {
List attributesGroup>
}
AttributesGroup {
attributesGroupId
value
}
AttributesGroupId {
attrName
userId
}
映射为:
<class name="AlternativeUserAttributes" table="`AlternativeUserAttributes`" lazy="true">
<composite-id name="Id" class="Data.Entities.AlternativeUserAttributesId">
<key-property name="AttributeName" column="`attributeName`" type="string" />
<key-many-to-one name="User" class="Entities.User" column="`userId`" />
</composite-id>
<property name="AttributeValue" column="`attributeValue`" type="string" />
<many-to-one name="User" column="`userId`" cascade="none" not-null="true" />
</class>
我得到一个错误,行计数应为1,但为零,当我尝试仅将AlternateUserAttribute保存为其自用保存时,我得到以下错误:
索引超出范围。必须为非负数且小于集合的大小。
参数名称:索引
这两次尝试都在为新项目插入内容,但我一直收到这些错误。有人可以帮忙吗?我很难跟上(你的帖子被弄坏了),但是使用复合ID会导致这个问题。由于ID类型是“分配的”,NHibernate不知道如何判断对象是暂时的还是持久的 有关更多信息,请参阅第17.4节 一种解决方案是使用版本或时间戳字段。我最终实现了跟踪持久性的基类并使用了拦截器 我在这里发布代码:
这就是说,如果您正在获取插入,那么我不能100%确定这是同一个问题。我通过将未保存的值设置为any并消除双向性来修复此问题。如果设置未保存的值,则返回错误:System.ArgumentOutOfRangeException:Index超出范围。必须为非负数且小于集合的大小。
AlternativeUserAttributes aua = new AlternativeUserAttributes();
aua.Id = new AlternativeUserAttributesId();
aua.Id.AttributeName = name;
aua.Id.User = curUser;
aua.AttributeValue = value;
aua.User = curUser;
curUser.AlternativeUserAttributes.Add(aua);