我有以下映射:
<!-- WidgetConfiguration -->
<class name="MyProject.WidgetConfiguration, MyProject" table="WidgetConfigurations">
<id name="Id" column="Id" type="Int64">
<generator class="native" />
</id>
<property name="Name" column="ConfigurationName" />
<map name="Widgets" table="WidgetConfigurationPositions" cascade="all" lazy="false" fetch="select" inverse="true">
<key column="WidgetConfigurationId" />
<index column="TargetId" type="string" />
<one-to-many class="MyProject.WidgetPlacement" />
</map>
</class>
<!-- End WidgetConfiguration -->
<class name="MyProject.WidgetPlacement, MyProject" table="WidgetConfigurationPositions">
<id name="Id" column="Id" type="Int64">
<generator class="native" />
</id>
<many-to-one name="Widget" class="MyProject.Widget, MyProject" column="WidgetId" lazy="false" />
<property name="Target" column="TargetId" not-null="true" />
<map name="Options" table="PlacedWidgetOptions" cascade="all" lazy="false" fetch="select">
<key column="WidgetConfigurationPositionId"/>
<index column="OptionName" type="string" />
<element column="OptionValue" type="string" />
</map>
</class>
而且,我有以下代码:
public override void Update(WidgetConfiguration obj)
{
using (var session = GetSession())
{
var tx = session.BeginTransaction();
session.Update(obj);
tx.Commit();
//session.Evict(obj);
}
}
我可以保存一个 WidgetConfiguration 只是花花公子,但是尝试更新一个 WidgetConfiguration,NHibernate 实际上执行了一个插入!这是来 self 的 NHibernate Profiler 的 session 。
begin transaction with isolation level: Unspecified
INSERT INTO WidgetConfigurations
(ConfigurationName)
VALUES ('dashboard' /* @p0 */)
select SCOPE_IDENTITY()
INSERT INTO WidgetConfigurationPositions
(WidgetId,
TargetId)
VALUES (1 /* @p0 */,
'row1-column1' /* @p1 */)
select SCOPE_IDENTITY()
UPDATE WidgetConfigurationPositions
SET WidgetId = 1 /* @p0 */,
TargetId = 'row1-column2' /* @p1 */
WHERE Id = 356 /* @p2 */
commit transaction
我不知道为什么会这样,而且 Google 也不是很有帮助。有人有什么想法吗?
最佳答案
尝试设置未保存值属性:
<id name="Id" column="Id" type="Int64" unsaved-value="0">
<generator class="native" />
</id>
ID 列的类型是什么?如果长呢?那么 unsaved-value 应该是 null
。您不需要设置它,但这是我首先要尝试的。
关于c# - 为什么 NHibernate 执行插入而不是更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3182470/