如何使用NHibernate为我的更新命令添加其他条件?

时间:2009-05-04 22:17:22

标签: nhibernate

我遇到Message表有主键(Id)和外键(Site)的情况。任何站点都可以创建消息记录,但只有创建记录的站点才能更新它。问题是,默认情况下,它将根据Id而不是Id和Site进行更新。我可以将主键更改为由id和site组成的复合/复合id,或者使用Native SQL;但是,我想知道是否有办法添加其他更新标准。

例如,这是您默认获得的:

public void MessageUpdate(Message oneMessage)
{
    using(ISession session = SessionFactory.OpenSession())
    using(ITransaction trans = session.BeginTransaction())
    {
        session.Update(oneMessage);
        trans.Commit();
    }
}

那么我如何在NHibernate中执行此操作而不创建复合ID或使用Native SQL:

Update MessageTable set MessageStatus = 2 where Id = ? and Site = ?;

3 个答案:

答案 0 :(得分:0)

我对您的问题的理解是规则是业务要求,因此NHibernate可能不适合此规则。您可以尝试在更新事件上实现侦听器:http://nhibernate.info/blog/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.html

另一个解决方案是将属性标记为更新为false以防止更改记录的网站? http://nhibernate.info/doc/nh/en/index.html#mapping-generated(参见生成的属性)

答案 1 :(得分:0)

您无法直接在NHibernate中执行此操作,但您可以将更新方法更改为:

public void MessageUpdate(Message oneMessage, string currentSite)
{
    if (oneMessage.Site != currentSite)
    {
        throw new Exception("meaningful error message");
    }
    using(ISession session = SessionFactory.OpenSession())
    using(ITransaction trans = session.BeginTransaction())
    {
        session.Update(oneMessage);
        trans.Commit();
    }
}

假设Site是一个字符串和Message的属性。此外,您还希望将更新包装在try..catch中,并在发生异常时回滚事务。

答案 2 :(得分:0)

我想我原来问题的简短回答是你不能为更新添加标准。您可以使用本机SQL来处理这种情况,如我最初建议的那样:

更新MessageTable设置MessageStatus = 2其中Id =?和Site =?;

或者你可以像Jamie Ide建议的那样解决问题,但是需要对数据库进行额外的查询来提取原始信息。