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);