2010-03-20 80 views
2

当ISession.Get被调用来通过其键而不是使用动态SQL来获取实体时,我想让NHibernate调用存储过程。NHibernate只有存储过程

我们一直在使用NHibernate并允许它为查询和插入/更新/删除生成我们的SQL,但现在可能必须将我们的应用程序部署到一个需要我们使用存储过程来访问所有数据库的环境。我们可以在我们的.hbm.xml映射文件中使用sql-insert,sql-update和sql-delete进行插入/更新/删除操作。我们的hql和标准查询将不得不用存储过程调用来替代。

但是,我还没有想出如何强制NHibernate使用自定义存储过程通过其密钥获取实体。我仍然希望能够调用ISession.Get,如:

using (ISession session = MySessionFactory.OpenSession()) 
{ 
    return session.Get<Customer>(customerId); 
} 

,并延迟加载的对象,但我想NHibernate的调用,而不是生成动态SQL我“GetCustomerById”存储过程。

可以这样做吗?

也许NHibernate不再适合我们必须支持的新环境。

+7

老实说,你真的需要改变环境,这些存储过程要求绝对是一成不变的,它们不提供任何安全性和性能方面的好处,如果不是开发人员几个月的时间,可以轻松地为您的项目增加数周。这听起来完全是一个管理缺陷。 – 2010-03-20 01:28:23

+1

我不得不同意克里斯。我不知道这是否是一个管理决策,但是为了使用SP而从多个角度来看并不是一个好的做法。 – 2010-03-20 01:34:21

+0

我同意SP是一个糟糕的路要走。我介绍了NH,以避免写出数百个存储过程并提高我们的生产力,这非常棒。客户站点的某些人认为这是安全性要求,以防止我假设的SQL注入。它可能是管理层,数据库管理员,基础设施/ IT,但我无法与最终决策者沟通。很明显,SQL注入在包含动态SQL的SP中可能仍是一个问题,因此策略可能会产生虚假的安全感。 – ChrisB2010 2010-03-20 01:54:29

回答

3

我没有尝试过,但你可能想看看native sql and custom loader概念。

这里有一个很好的文章由Ayende Rahien:Using NHibernate With Stored Procedures

这里的另一个更容易理解的基础上NH beta版由斯科特·麦克马斯特版本:Stored Procedures in NHibernate

+0

感谢您的信息。它看起来像加载器的想法是我正在寻找,并成为NH的新手,我还不知道它。一些好消息:我们现在正在开发的项目不会被部署到受限制的环境中,所以暂时我们要让NH创建SQL。 – ChrisB2010 2010-03-23 02:48:32