我是否必须将DB中的每个表映射到我正在使用的NHibernate类

时间:2012-07-19 11:50:00

标签: c# nhibernate fluent-nhibernate

我有一个包含许多软件包和存储过程的旧版Oracle数据库。我想映射到一些表并使用一些存储过程。我正试图找到一种方法,我不必映射到存储过程使用的每个表。

举一个具体的例子,说我有以下表格:

Customer
--------
ID 
Name

Transaction
-----------
FromCustomerID
ToCustomerID
AccountCode
Amount

Transaction表具有FromCustomerID,ToCustomerID和AccountCode的组合键。现在我有一个存储过程返回4个字段:FromCustomerID,FromCustomerName,ToCustomerID和AccountCode。

我将客户和交易映射为:

public class CustomerMap:ClassMap<Customer>
{
    public CarePartyMap()
    {
        Table("Schema.Customer");           

        Id(x => x.Id)
            .Column("customer_id")
            .GeneratedBy.Assigned();

        Map(x => x.Name, "Name");
    }
}

public class TransactionsMap : ClassMap<Transactions>
{
    public TransactionsMap ()
    {
        Table("Schema.Transactions");
        CompositeId().KeyProperty(x => x.FromCustomer, "From_Customer_ID")
            .KeyProperty(x => x.ToCustomer, "To_Customer_ID")
            .KeyProperty(x => x.AccountCode, "Account_Code");
       //blah blah
    }
}

然后我尝试创建一个嵌入式hbm文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="MyApp.Domain"
               namespace="MyApp.Domain.Something"
               auto-import="true">

<sql-query name="MySP">
  <query-param name="n_Customer_id" type="int"/>
  <query-param name="n_location_id" type="int"/>
<return class="Transaction" alias="t">
  <return-property column="Account_Code" name="AccountCode"/>
</return>
<return-join property="t.FromCustomer" alias="fc">
  <return-property name="Id" column="From_Customer_id"/>
  <return-property name="Name" column="From_Customer_Name"/>
</return-join>
<return-join property="t.ToCustomer" alias="tc">
  <return-property name="Id" column="To_Customer_Id"/>
</return-join>
{ call MyPkg.MyProcedure(:n_Customer_id,:n_location_id) }
</sql-query>

</hibernate-mapping>

我无法使用此功能,因为Transactions中的ID是一个复合键,并且无法正确初始化Transaction实体。但是,我想知道的是如何在不映射到Transaction表的情况下执行这些映射。除了这个存储过程之外,我没有使用此映射。如果我必须映射到存储过程调用的每个表,这将是一项大量的工作。此外,是否有任何快捷方式可以使用存储过程调用的复合键映射某些内容?

谢谢,BillN

0 个答案:

没有答案