代码之家  ›  专栏  ›  技术社区  ›  David Yates

如何使用nhibernate向更新命令添加其他条件?

  •  0
  • David Yates  · 技术社区  · 15 年前

    在这种情况下,消息表具有主键(ID)和外键(站点)。任何站点都可以创建消息记录,但只有创建该记录的站点才能更新该记录。问题是,默认情况下,它将根据ID而不是ID和站点进行更新。我可以将主键更改为由ID和站点组成的复合/复合ID,或者使用本机SQL;但是,我想知道是否可以添加其他更新条件。

    例如,这是默认情况下得到的:

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

    那么,在不创建复合ID或使用本机SQL的情况下,如何在nhibernate中执行此操作:

    Update MessageTable set MessageStatus = 2 where Id = ? and Site = ?;
    
    3 回复  |  直到 9 年前
        1
  •  0
  •   Jamie Ide    15 年前

    您不能在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();
        }
    }
    

    假设站点是一个字符串和消息的属性。此外,您还需要将更新包装在try..catch中,并在发生异常时回滚事务。

        2
  •  0
  •   David Yates    15 年前

    我想我最初的问题的简短答案是,您不能向更新添加条件。您可以使用本机SQL来处理这种情况,正如我最初建议的那样:

    更新messagetable set messagestatus=2,其中id=?站点=?;

    或者您可以按照JamieID的建议来处理这个问题,但是需要对数据库进行额外的查询来提取原始消息。

        3
  •  0
  •   hazzik    9 年前

    我理解你的问题,规则是商业要求,所以也许NHibernate不是这个规则的地方。您可以尝试在更新事件上实现侦听器: http://nhibernate.info/blog/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.html

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