c# - 为什么 NHibernate 执行插入而不是更新?

标签 c# asp.net-mvc nhibernate

我有以下映射:

<!-- 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/

相关文章:

asp.net-mvc - ASP.NET Core [FromBody] 与 MVC 5 绑定(bind)

c# - 如何在 Fluent-nHibernate 查询中指定单个属性(鉴别器)的类型/类。

c# - 为什么包含在 EF6 中被忽略

c# - Mono 上的跨平台高分辨率滴答计数器?

javascript - 重新加载时使用 C# 更改 HTML 页面

.net - 从 NHibernate 映射生成数据库模式

nhibernate - 如何将对象从反射转换为通用集合?

c# - 修改结构变量

javascript - 在 Angularjs 中通过 IP 地址获取用户的位置

c# - 仅将 ASP.NET MVC 应用程序管理站点锁定到 LocalHost