0
我知道我们可以很容易地使用过滤器来查询NHibernate的其他where
条件,但是有可能在更新或删除时应用过滤器吗?NHibernate - 是否可以在UPDATE/DELETE上应用过滤器?
如果是这样,我该怎么做到这一点?
我知道我们可以很容易地使用过滤器来查询NHibernate的其他where
条件,但是有可能在更新或删除时应用过滤器吗?NHibernate - 是否可以在UPDATE/DELETE上应用过滤器?
如果是这样,我该怎么做到这一点?
是的,它是可能的,使用HQL(Hibernate查询语言)
这里有一个批量更新
IQuery updateQuery = this.Session.CreateQuery("update TransferItem set Status = :newStatus where Status = :oldStatus")
.SetParameter("oldStatus", DownloadStatus.Active)
.SetParameter("newStatus", DownloadStatus.Queued);
updateQuery.ExecuteUpdate();
NHibernate的应用配置的映射来创建并运行下面的SQL的一个例子:
update cms_TransferItem set [email protected] where [email protected]
下面是批量删除的示例
IQuery deleteQuery = this.Session.CreateQuery("delete TransferItem ti WHERE ti.Status = :statusToGo")
.SetParameter("statusToGo", DownloadStatus.Completed);
deleteQuery.ExecuteUpdate();
,其执行这样的SQL:
delete from cms_TransferItem where [email protected]
你可能会问,如果你有一个查询语言的工作,为什么不只是写原始SQL?当您使用HQL时,您正在使用其余.NET代码正在处理的概念性业务对象。 ORM工具的好处在于,对于大部分代码来说,数据库表和对象映射都是抽象出来的。使用HQL,您将继续与对象层交互,而不是直接与数据库表交互。
有趣的,但遗憾的是,在我的情况下,这是行不通的,因为我们正在使用通用的存储库模式。这个想法是在数据库更新或删除时应用一个自定义函数调用。有一种方法可以通过简单的'session.SaveOrUpdate'或者'session.Delete'调用吗? (对于每次删除或更新,过滤器会生成如下内容:'Where IsOperationAllowedFromUser(:userId,:itemId)') – 2014-09-19 13:08:30
@ Sam9291 IsOperationAllowedFromUser是SQL函数还是.NET函数? – 2014-09-19 21:12:08
这将是一个SQL函数 – 2014-09-21 11:52:29