尝试添加新孩子时,我有三个课程会出现问题。
他们是:
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>
我可以毫无问题地删除用户类上的项和类SaveUpdate,但是当我尝试时 通过以下方式将项目添加到集合中:
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);
我得到一个错误,关于行数预计为1但是为零,当我尝试仅使用Save保存AlternateUserAttributes时,我收到此错误: 指数超出范围。必须是非负数且小于集合的大小。 参数名称:index
两次尝试都为新项目提出了INSERT,但我不断收到这些错误。有人可以提供帮助吗?
答案 0 :(得分:1)
我很难跟踪(太糟糕了你的帖子),但是使用复合ID可能会导致这个问题。由于ID类型是“已分配”,因此NHibernate不知道如何判断对象是暂时的还是持久的。
https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/example-parentchild.html
有关详细信息,请转至第17.4节。
一种解决方案是使用版本或时间戳字段。我最终实现了跟踪持久性和使用拦截器的基类。
我在这里发布了代码:How to save a child with assigned id in nhibernate
那就是说,如果你得到INSERT,那么我不是100%肯定这是同样的问题。
答案 1 :(得分:1)
我通过将unsaved-value设置为any并消除双向性来修复此问题。