nHibernate Master Detail删除

Cra*_*aig 3 sql-server nhibernate

我配置了Master Detail关系.hbm文件如下.当我运行这样的代码

Favourite favourite = favourites.Find(f => f.Id== id);
user.Favourites.Remove(favourite);
m_UserRepository.Save(ref user);
Run Code Online (Sandbox Code Playgroud)

我收到错误消息

NHibernate.Exceptions.GenericADOException:无法删除集合行:[Model.Entities.User.Favourites#249] [SQL:SQL不可用] ---> System.Data.SqlClient.SqlException:无法将值NULL插入列' UserId',表'BE.Favourite'; 列不允许空值.更新失败.

关于这意味着什么的任何建议请帮忙.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model.Entities" schema="BE" assembly="Model" default-lazy="false">
  <class name="Model.Entities.User, Model" table="Users" >
    <id name="UserId" column="UserId" type="int" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="UserName" column="UserName" type="string" />

    <bag name="Favourites" cascade="all" lazy="true">
      <key column="UserId"/>
      <one-to-many class="Model.Entities.Favourite, Model"/>
    </bag>

  </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

Jam*_*ory 6

你试过inverse="true"装袋吗?


F.D*_*tel 6

在这种情况下,您实际上需要多对多关系:

<class name="User">
  <id name="Id">
    <generator class="native">
      <param name="sequence">object_sequence</param>
    </generator>
  </id>
  <version name="Version" />
  <property name="Name" />
  <set name="Roles" table="User_Favourite">
    <key column="UserId"/>
    <many-to-many column="FavouriteId" class="Favourite"/>
  </set>
</class>
Run Code Online (Sandbox Code Playgroud)

而另一方面则相同:(*注意逆="真")

<class name="Favourite">
  <id name="Id">
    <generator class="native">
      <param name="sequence">object_sequence</param>
    </generator>
  </id>
  <version name="Version" />
  <property name="RoleName" />
  <set name="Users" table="User_Favourite" inverse="true">
    <key column="FavouriteId"/>
    <many-to-many column="UserId" class="User"/>
  </set>
</class>
Run Code Online (Sandbox Code Playgroud)

从NHibernate 2.0文档:

非常重要注意:如果声明<key><one-to-many>关联的列NOT NULL,NHibernate在创建或更新关联时可能会导致约束违规.要防止出现此问题,必须使用标记为的多值结束(集合或包)的双向关联inverse="true".请参阅本章后面的双向关联讨论.

最后,我不确定你是否真的想在这里使用一个包.一个用户可以拥有两次或更多次相同的收藏?

PS:另外,请注意,lazy ="true"是自NHibernate 1.2以来的默认行为.