NHibernate并将具有复合集合的新项目添加到子集合中

时间:2009-07-13 07:43:23

标签: c# nhibernate hibernate

尝试添加新孩子时,我有三个课程会出现问题。

他们是:

 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,但我不断收到这些错误。有人可以提供帮助吗?

2 个答案:

答案 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并消除双向性来修复此问题。