使用 NHibernate 创建数据库视图

Posted

技术标签:

【中文标题】使用 NHibernate 创建数据库视图【英文标题】:Creating database views with NHibernate 【发布时间】:2010-07-21 17:53:12 【问题描述】:

有谁知道如何使用条件查询的结果从休眠状态创建视图?

我们的应用程序有一些遗留部分使用应用程序生成的视图进行数据检索,我喜欢将新的 NHibernate 内容与这些内容联系起来以尽量减少摩擦。

我会把它变成一个扩展方法,这样我最终可以做这样的事情:

session.CreateCriteria<Thing>().CreateReportView().List();

有什么想法吗?

现有流程是这样的:

SQLString = _bstr_t("SELECT name FROM User WHERE Retired = false");

...run the query process the results, then...

SQLStringView = _bstr_t(" \
  BEGIN EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW ") + ViewName + _bstr_t(" AS ") + SQLString;

所以每当我们运行这个查询时,我们都会得到一个包含相同数据的视图。我不知道如何复制这是休眠状态。

【问题讨论】:

您的数据库中已经存在视图?还是您的应用会即时创建它们? 应用程序当前使用 ADO 动态创建它们。我们将一切都转移到使用 NHibernate,但需要维护遗留东西的视图。所以我们需要在查询执行的时候创建它。 @Matt Sharpe:我不确定我是否完全理解;你能发布一些示例代码来解释你的“only the fly”视图现在是如何工作的吗? 当用户运行过滤器以查看特定数据时,记录会返回给他们,但结果集也会写入视图,然后用于报告和某些屏幕的数据访问。因此,每次用户运行过滤器(这是一个 SQL 查询)时,结果数据都会写入视图。我需要使用 Hibernate 做同样的事情。 “视图”是指数据库中的视图,还是应用程序端存在的东西?另外,这是用于测试代码还是用于生产代码? 【参考方案1】:

要直接使用 NHibernate 创建视图,请查看“数据库对象”映射元素。

Ayende 有一个很好的例子here。

【讨论】:

【参考方案2】:

查看this article 了解将实体类映射到视图和表的说明。我不确定您是否能够按照您的指定在运行时动态创建视图;但也许这可以作为使用数据库对象映射的模式生成过程的一部分来完成?

【讨论】:

文章不再可用【参考方案3】:

如果您只对过滤返回的数据感兴趣,您可能想看看 Nhibernate 的过滤机制; here is a good article 概述了它们的用法。

【讨论】:

感谢您,但过滤器是用户创建的自定义过滤器,涵盖整个域模型并包括诸如 Plan.Owner = user 之类的内容。这一切都建立在一个休眠条件查询中,但是为了维护应用程序的其他部分,我需要生成这个视图。使用该视图,因此技术堆栈的其他部分(例如 s-s-rS 和 COM)不必解析保存的过滤器并自行运行 SQL。

以上是关于使用 NHibernate 创建数据库视图的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate之旅(14):探索NHibernate中使用视图

SQL中视图的创建。修改,删除

mysql中的视图

数据库3

使用NHibernate从外键获取MySQL表中的数据

SQL中视图的创建。修改,删除