NHibernate:在更新/删除/插入视图上映射的类时是否可以使用存储过程?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NHibernate:在更新/删除/插入视图上映射的类时是否可以使用存储过程?相关的知识,希望对你有一定的参考价值。

以下是序言:

  • 我有一个SQL视图和映射的NHibernate C#类
  • 我只允许通过一些存储过程修改SQL View数据(插入/更新/删除)

如何在映射文件中表示这样的逻辑?是否有可能只有特定的映射或我需要一些补充代码?

答案

这在19.3. Custom SQL for create, update and delete中有描述

例:

<class name="Person" table="PersonView">
    <id name="id">
        <generator class="guid"/>
    </id>
    <property name="name" not-null="true"/>
    <sql-insert>exec createPerson ?, ?</sql-insert>
    <sql-delete>exec deletePerson ?</sql-delete>
    <sql-update>exec updatePerson ?, ?</sql-update>
</class>
另一答案

您可以使用NHibernate的Named Queries调用SQL的存储过程:

< ?xml version="1.0" encoding="utf-8"?>
<hibernate -mapping xmlns="urn:nhibernate-mapping-2.2">
    <sql -query name="FindPlayerByLastDrugTest">
        <query -param name="LastDrugTestDate" />

            <return class="Player">
                <return -property column="PlayerID" name="PlayerID" />
                <return -property column="PlayerName" name="Name" />
                <return -property column="TeamID" name="Team" />
                <return -property column="LastDrugTestID" name="LastDrugTestResult" />
            </return>

        exec spSelectPlayersByLastDrugTestDate @LastDrugTest=:LastDrugTestDate
    </sql>
</hibernate>

/*** Back on C# ***/
IQuery query = session.GetNamedQuery("FindPlayerByLastDrugTest")
                      .SetDateTime(new DateTime(2003, 1, 1));

// Return a collection
IList list = query.List();

// Return a single entity
var result = query.UniqueResult();

更多信息here

以上是关于NHibernate:在更新/删除/插入视图上映射的类时是否可以使用存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate Oracle - 事务提交问题

如何在 NHibernate 中映射没有标识列的视图?

NHibernate 中映射视图的策略

Nhibernate子类映射问题

NHibernate 级联删除不适用于一对多关联

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