如何使用NHibernate2.1为插入存储过程构建映射文件
我正在寻找一种使用NHibernate2.1映射简单插入存储过程的方法 我发现的大多数示例都是用于从存储过程中获取数据的,但我试图做的是使用存储过程插入类似审计的记录。但我更愿意为此构建一个映射文件 另外,要明确的是,我不希望像下面这样构建实体+映射文件。相反,我想看看是否可以简单地将参数映射到单个xml文件中,并使用会话对象通过“CreateSQLQuery”调用它如何使用NHibernate2.1为插入存储过程构建映射文件,nhibernate,stored-procedures,Nhibernate,Stored Procedures,我正在寻找一种使用NHibernate2.1映射简单插入存储过程的方法 我发现的大多数示例都是用于从存储过程中获取数据的,但我试图做的是使用存储过程插入类似审计的记录。但我更愿意为此构建一个映射文件 另外,要明确的是,我不希望像下面这样构建实体+映射文件。相反,我想看看是否可以简单地将参数映射到单个xml文件中,并使用会话对象通过“CreateSQLQuery”调用它 <class name="Staff, SampleApplication.Library" table="Staff"&
<class name="Staff, SampleApplication.Library" table="Staff">
<id name="Id" column="Id" type="Int32">
<generator class="native" />
</id>
<property name="LastName" column="LastName" type="String" length="255"/>
<property name="FirstName" column="FirstName" type="String" length="255"/>
<property name="EmailAddress" column="EmailAddress" type="String" length="512"/>
<sql-insert>EXEC InsertStaff ?,?,?</sql>
</class>
执行插入人员?,?,?
顾名思义,CreateSQLQuery用于查询,而不是用于插入/更新/删除。调用您描述的存储过程是可能的,但不能通过任何NHibernate支持的查询机制调用
存储过程本身可以通过
标记包含在映射文件中。以下示例适用于Sql Server:
<database-object>
<create>
<![CDATA[
go
create procedure dbo.SetFooBar
@Foo nvarchar(32)
@Bar nvarchar(32)
as
begin
...
end
go
]]>
</create>
<drop>
<![CDATA[
if object_id (N'dbo.SetFooBar', N'P') is not null
drop procedure dbo.SetFooBar;
go
]]>
</drop>
</database-object>
private void SetFooBar(ISession session, string foo, string bar)
{
var connection = session.Connection;
var implementor = session.GetSessionImplementation();
var driver = implementor.Factory.ConnectionProvider.Driver;
var command = driver.GenerateCommand(CommandType.StoredProcedure,
new global::NHibernate.SqlCommand.SqlString("SetFooBar"),
new global::NHibernate.SqlTypes.SqlType[] {
global::NHibernate.SqlTypes.SqlTypeFactory.GetString(32),
global::NHibernate.SqlTypes.SqlTypeFactory.GetString(32),
});
command.Connection = connection;
SetParameter(command, 0, "@Foo", foo);
SetParameter(command, 1, "@Bar", foo);
command.ExecuteNonQuery();
}
private void SetParameter(IDbCommand cmd, int index, string name, object value)
{
IDataParameter param = (IDataParameter) cmd.Parameters[index];
param.ParameterName = name;
param.Value = value;
}