当我通过调用SaveOrUpdate()进行保存时,我收到此警告,并且在调用Transaction.Commit()之后数据未保存在数据库中。
NHibernate.Engine.ForeignKeys - 无法使用 确定是否[项目名称] 分配的标识符[primarykey]是 暂时的或分离的;查询 数据库。使用显式Save()或 在会话中更新()以防止这种情况。
我正在插入一个新对象。谷歌搜索告诉我调用Save()而不是SaveOrUpdate():意味着Save()仅用于插入。
我在谷歌搜索并没有看到太多关于此的内容。 有人可以给我这个问题或这个警告的建议吗?
编辑: 这是模拟的样本映射文件 -
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly=""
namespace="">
<class name="Customer" table="[dbo].[Customer]" optimistic-lock="none" >
<id name="CustomerId" column="CustomerId" >
<generator class="assigned"/>
</id>
<property name="Name" column="Name" />
<property name="Age" column="Age" />
<set name="CustomerDetails" cascade="none" inverse="true" fetch="select">
<key>
<column name="CustomerId"/>
</key>
<one-to-many class="CustomerDetail"/>
</set>
<many-to-one name="MGender" fetch="select" cascade="none">
<column name="GenderCode"/>
</many-to-one>
</class>
</hibernate-mapping>
<class name="CustomerDetails" table="[dbo].[CustomerDetail]" optimistic-lock="none" >
<id name="CustomerDetailId" column="CustomerDetailId" >
<generator class="assigned"/>
</id>
<property name="Detail1" column="Detail1" />
<many-to-one name="Customer" fetch="select" cascade="none">
<column name="CustomerId"/>
</many-to-one>
</class>
<class name="MGender" table="[dbo].[MGender]" optimistic-lock="none" >
<id name="GenderCode" column="GenderCode" >
<generator class="assigned"/>
</id>
<property name="Description" column="Description" />
<set name="Customers" cascade="none" inverse="true" fetch="select">
<key>
<column name="GenderCode"/>
</key>
<one-to-many class="Customer"/>
</set>
</class>
答案 0 :(得分:6)
您正在使用指定的标识符,因此您需要设置unsaved-value属性,以便NHibernate可以确定是否应插入或更新实体。或者您可以显式调用Save for new entities。
<id name="CustomerId" column="CustomerId" unsaved-value="???" >
<generator class="assigned"/>
</id>
答案 1 :(得分:0)
请注意,如果您使用自定义ID,即不使用Id(x =&gt; x.Id).GeneratedBy.Assigned()并且您没有任何版本或时间戳列,则NHibernate无法使用知道thuis是新行还是现有行。所以,我通过使用GeneratedBy.UuidString()修复了我的问题。奇迹般有效。几乎将我的代码投入生成并显示此错误消息,幸运的是我的信息已被保存。