我配置了Master Detail关系。 hbm文件如下。当我运行像这样的代码时
Favourite favourite = favourites.Find(f => f.Id== id);
user.Favourites.Remove(favourite);
m_UserRepository.Save(ref user);
我收到错误消息
NHibernate.Exceptions.GenericADOException:无法删除集合行:[Model.Entities.User.Favourites#249] [SQL:SQL not available] ---> 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>
答案 0 :(得分:6)
您是否尝试在行李上设置inverse="true"
?
答案 1 :(得分: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>
另一方面也是如此:( *注意逆=“真”)
<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>
From the NHibernate 2.0 Documentation:
非常重要提示:如果<key>
关联的<one-to-many>
列声明为NOT NULL
,则NHibernate在创建或更新关联时可能会导致约束违规。要防止出现此问题,必须使用双向关联,并将标记为inverse="true"
的多值结尾(集合或包)。请参阅本章后面的双向关联讨论。
最后,我不确定你是否真的想在这里使用一个包。一个用户可以拥有两次或更多次相同的收藏?
P.S。:另外,请注意,lazy =“true”是自NHibernate 1.2以来的默认行为。
答案 2 :(得分:1)
尝试将级联规则更改为:
<bag name="Favourites" cascade="all,delete-orphan" lazy="true">
<key column="UserId" not-null="true"/>
<one-to-many class="Model.Entities.Favourite, Model"/>
</bag>