2

通常我们为每个表类创建 1:1 映射。

Ex(Tables):
[users]
user_id - PK
名称

[transactions]
user_id - FK
item_id
amount

示例映射:
public class User
{
public string ID {get; 设置;}
公共字符串名称{get; 设置;}
}

公共类交易
{
公共字符串用户ID {get; 设置;}
公共字符串 ItemID {get; 设置;}
公共小数{get; 设置;}
}

但是由于优化的考虑,有时在查询结果时需要进行一些操作;我们通常使用从多个表返回结果的存储过程。如果我们使用上面的例子;我们如何调用从连接表返回结果的过程?仅仅为了这个组合记录,是否可以不创建新类和绑定?

谢谢!

4

1 回答 1

3

在这种情况下,可以使用存储过程,使用如下映射结构:

<sql-query name="LoadUsersAndTransactions" xml:space="preserve">
  <return class="User" alias="u">
    <return-property name="ID" column="user_id" />
    <return-property name="Name" column="name" />
  </return>
  <return-join property="u.Transactions" alias="t">
    <return-property name="key" column="user_id" />
    <return-property name="element" column="item_id" />
    <return-property name="element.id" column="item_id" />
    <return-property name="element.Amount" column="amount" />
  </return-join>
  EXEC dbo.SelectUsersAndTransactions :param_1, ..., :param_N
</sql-query>

此示例假定 Transactions 被映射为 User 类上的包。您将在 C# 中按如下方式使用此查询:

IList<User> users = session
    .GetNamedQuery("LoadUsersAndTransactions")
    .SetString("param_1", parameterValue1)
    ...
    .SetString("param_N", parameterValueN)
    .List<User>();

关于使用自定义 SQL 查询的 NHibernate 文档在这里

干杯,格克。

于 2011-01-08T22:11:01.430 回答