当我保存新报告时,NHibernate会插入报告,忽略发布并尝试插入UserPublication。然而,SQL然后抱怨违反FK约束。 它就像NHibernate一样认为发布是新的,即使数据库中不存在该行。
将实体关系视为: 报告可以有很多出版物(出版物属于报告) 出版物可以有许多UserPublications(UserPublications属于出版物)
任何想法我做错了什么? 提前谢谢。
这是映射:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
<class name="Model.Report, Model" table="Report" lazy="true">
<id name="Id" access="property" column="ReportID">
<generator class="assigned"></generator>
</id>
<property name="DeleteUnread" access="property" />
<property name="Description" access="property" />
<property name="Name" access="property" />
<bag name="Publications" access="property" lazy="true" cascade="all-delete-orphan">
<key column="ReportID"/>
<one-to-many class="Model.Publication, Model"/>
</bag>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
<class name="Model.Publication, Model" table="Publication" lazy="true">
<id name="Id" access="property" column="PublicationID">
<generator class="assigned"></generator>
</id>
<property name="CreatedOn" access="property" />
<property name="FileExtension" access="property" />
<property name="IsDownloaded" access="property" />
<property name="ToBeDownloaded" access="property" />
<property name="Name" access="property"/>
<bag name="UserPublications" access="property" lazy="true" cascade="all-delete-orphan">
<key column="PublicationID"></key>
<one-to-many class="Model.UserPublication, Model" />
</bag>
<many-to-one name="Report" class="Model.Report, Model" lazy="false" column="ReportID" not-null="true" cascade="none">
</many-to-one>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
<class name="Model.UserPublication, Model" table="UserPublication" lazy="true">
<id name="Id" access="property" column="UserPublicationID">
<generator class="native"></generator>
</id>
<property name="IsFlaggedForDeletion" access="property" column="IsFlaggedForDeletion" />
<property name="HasBeenRead" access="property" column="HasBeenRead" />
<property name="DateReceived" access="property" column="DateReceived" />
<property name="MustRead" access="property" column="MustRead" />
<property name="ShowToolbar" access="property" column="ShowToolbar" />
<property name="MaxAge" access="property" column="MaxAge" />
<property name="FeedId" access="property" column="FeedId" />
<property name="CanEdit" access="property" column="CanEdit" />
<many-to-one name="User" access="property" column="ClientUserID" class="Model.ClientUser, Model" not-null="true" cascade="none">
</many-to-one>
<many-to-one name="Publication" access="property" class="Model.Publication, Model" column="PublicationID" not-null="true" cascade="none">
</many-to-one>
</class>
答案 0 :(得分:0)
我认为问题是发布的id是一个指定的id,因此NHibernate无法识别何时应该插入一个发布。 刷新会话时,首先插入所有插入的对象,然后更新所有更新的对象,然后删除所有已删除的对象。 所以我认为这将在这里发生: 您保存一个包含userpublications的发布的报告。因为发布了id NHibernate假定它必须更新并忽略它,但UserPublication id是本机的,NHibernates知道何时应该插入它并尝试插入它因此发生FK违规。 要解决此问题,您可以向发布添加版本属性,以便NHibernate可以根据其版本值插入它。
答案 1 :(得分:0)
Publication类中的UserPublications包具有错误的键元素。它应该是:
<key column="PublicationID"/>
答案 2 :(得分:0)
这很有效。我将unsaved-value属性设置为“any”。
我认为不会有任何重复。
<id name="Id" access="property" column="PublicationID" unsaved-value="any">
<generator class="assigned"></generator>
</id>