我遇到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 = ?;
答案 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建议的那样解决问题,但是需要对数据库进行额外的查询来提取原始信息。