更新父实体时,不会保存添加到行李收集的NHibernate新项目

更新父实体时,不会保存添加到行李收集的NHibernate新项目,nhibernate,collections,bag,Nhibernate,Collections,Bag,我正在使用NHibernate版本3.1.0.4000和hbm映射文件。 当我有一个实体,其中包含一个袋收集,我保存的所有项目添加到袋实体,然后它保存所有收集项目罚款。但是,当我随后(在初始保存之后)将另一项添加到集合并保存实体时,它不会将新项保存到集合中。我查看了NHibernate生成的SQL,它创建了初始的Insert SQL语句,但它没有创建Update SQL语句来更新外键值。解决方案中的所有行李都会出现此问题 以下是一个映射摘录: <?xml version="1.0"

我正在使用NHibernate版本3.1.0.4000和hbm映射文件。 当我有一个实体,其中包含一个袋收集,我保存的所有项目添加到袋实体,然后它保存所有收集项目罚款。但是,当我随后(在初始保存之后)将另一项添加到集合并保存实体时,它不会将新项保存到集合中。我查看了NHibernate生成的SQL,它创建了初始的Insert SQL语句,但它没有创建Update SQL语句来更新外键值。解决方案中的所有行李都会出现此问题

以下是一个映射摘录:

    <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   default-lazy="false"
                   namespace="some_namespace"
                   assembly="some_assembly">

  <class name="Landing"
            table="[Landing]"
            select-before-update="true"
            optimistic-lock="version">
    <id name="Id"
        column="[Id]"
        unsaved-value="null">
      <generator class="assigned" />
    </id>

    <version name="Version"
            column="[Version]"
            unsaved-value="null" />

    <bag name="LandingPermits"
         cascade="all-delete-orphan"
         access="field.camelcase">
      <key column="[LandingId]" />
      <one-to-many class="LandingPermit" />
    </bag>

  </class>
</hibernate-mapping>
我尝试了一些方法,包括将反向属性设置为true,但没有成功。 希望这对任何人来说都是足够的信息。
谢谢

如果您的收藏是
inverse=false
(默认值),这意味着收藏的所有者(父项)对关系负责。 在上面的代码中,不清楚父级和子级是否都是IAggregateRoot,但如果它们都是,则意味着,当您在不知道父级的会话中保存子级时,子级将被很好地保存,但不会被添加到集合中

如果您使用
inverse=true
,则孩子将对关系负责。在这种情况下,模型应该是双向的,并且应该映射两端

你在这里有几个选择

  • 孩子真的是聚合根吗?也许它应该和它的父代一起保存
  • 使用双向关系并使用
    inverse=true

谢谢您的回复,罗杰。在我的情况下,孩子(登陆许可证)不是一个IAGGERGATEROOT
    public NHibernateRepository(ISessionFactory factory, string queriesAssemblyName = null, string clientName = null)
{
    this.sessionFactory = factory;
    this.queriesAssemblyName = queriesAssemblyName;
    this.clientName = clientName;

    if (!string.IsNullOrEmpty(this.queriesAssemblyName))
        LoadQueries();
}

public virtual void Save(IAggregateRoot entity)
{
    Save(new IAggregateRoot[] { entity });
}

public virtual void Save(IAggregateRoot[] entities)
{
    try
    {
        using (var session = OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                try
                {
                    foreach (var entity in entities)
                    {
                        if (entity.IsNew)
                            entity.AddedDateTime = DateTime.Now;
                        else
                            entity.UpdatedDateTime = DateTime.Now;

                        session.SaveOrUpdate(entity.GetType().Name, entity);
                    }
                    transaction.Commit();
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    throw e;
                }
                finally
                {
                    if (session.Connection.State == ConnectionState.Open)
                        session.Connection.Close();

                    session.Connection.Dispose();
                    session.Close();
                }
            }
        }
    }
    catch (GenericADOException e)
    {
        var sqlException = e.InnerException as SqlException;

        if ((sqlException != null) && (sqlException.Number == ForeignKeyExceptionNumber))
            throw new EntityInUseException("Save", sqlException);
        else
            throw new RepositoryException("Save", e.InnerException);
    }
    catch (StaleObjectStateException e)
    {
        throw new ConcurrencyException("Save", e, new Identity((Guid?)e.Identifier));
    }
    catch (Exception e)
    {
        throw new RepositoryException("Save", e);
    }
}