在nHibernate中更新对象

时间:2009-12-17 20:56:15

标签: nhibernate

我对nHibernate很新,所以这可能是一个非常愚蠢的问题。但无论如何,保存对象工作正常,更新它不起作用。

这就是我正在做的事情:

using (ISession session = _sessionFactory.OpenSession())
{
    session.SaveOrUpdate(schemaChange);
    schemaChange.ScriptName = "New one";
    session.SaveOrUpdate(schemaChange);
}

第一个SaveOrUpdate在数据库中插入schemaChange。第二个应该更新同一个对象,但是nHibernate不会这样做。

在输出中我得到:

DEBUG - 持久化实例:DotNetMigrations.Core.Domain.SchemaChange

DEBUG - 忽略持久化实例

DEBUG - 已与会话关联的对象:[DotNetMigrations.Core.Domain.SchemaChange#129]

更新

嗯,因为它很简单(也是一个愚蠢的问题),我自己找到了它:

session.SaveOrUpdate(schemaChange);
schemaChange.ScriptName = "New one";
session.Flush();

看得见。 nHibernate真的优于我曾经使用的任何orm工具。

我似乎无法弄清楚为什么有SaveOrUpdate方法...如果你正在更新,那么对象是否自动已经与会话相关联? (因为你是以第一种方式从数据库中获取它的。除非你把它发送到例如Flex RIA并且它回来了)

那么,你怎么知道对象是否已经关联,要么是SaveOrUpdate()还是只是Flush()?

1 个答案:

答案 0 :(得分:2)

您可以使用Method Session.Contains(object)来解决这个问题。 Save()和Update()之间的区别在于Save会在必要时分配Id,如果对象没有密钥或者数据库中不存在Key,Update()将失败。

SaveOrUpdate修复了有关使用瞬态对象的一些问题,如果你不关心对象的状态是什么,你可以称之为,但根本不是圣杯。 如果你知道对象有什么状态,我建议你调用确切的方法。

希望这有助于澄清一点。