在两个非关键字段之间加入

Ham*_*359 5 nhibernate fluent-nhibernate

我正在努力使用Fluent NHibernate整合一个简单的POC应用程序,试图表明它可以完成我们当前的手动数据访问工具的所有功能.我的老板担心的一个边缘案例是能够在一个查询中访问同一数据库中的多个模式.到目前为止,只要查询一次只触及一个模式,我就可以从两个模式中的表中提取数据.如果我尝试执行一个将从两个模式连接表的命令,它就会爆炸.

根据我看到的错误消息,我不认为问题是加入模式,而是我需要加入表的两个字段都是非关键字段.这两个表的结构是这样的:

Customer (in schema 1)
--------
int CustomerId (Primary Key)
string Name
...other fields

Order (in schema 2)
-------- 
int OrderId (primary key)
string CustomerName
...other fields

直接使用sql我可以加入Name/CustomerName字段并从两个表中获取数据.但是,在尝试从Order表中提取数据并包含Customer表中的数据时,使用NHibernate时,我不断收到"System.FormatException:输入字符串格式不正确".这让我相信NHibernate正在尝试加入CustomerName字段和CustomerId字段.

我知道如何告诉它在我的订单映射中使用CustomerName字段,但我无法找到一种方法来告诉加入Customer表的Name字段.

我的映射看起来像这样:

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap()
    {
        Id(x => x.Id)
            .Column("CustomerId");
        Map(x => x.Name);
    }
}


public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Schema("schema2");
        Id(x => x.Id)
            .Column("OrderID");
        Map(x => x.CustomerName)
            .Column("CustomerName");
        References<Customer>(x => x.Customer, "CustomerName");
    }
}
Run Code Online (Sandbox Code Playgroud)

我写的SQL以获得我想要的结果将是这样的:

select o.OrderId, o.CustomerName, c.CustomerId
from order o
inner join customer c on c.Name = o.CustomerName
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?是否有不同/更好的方法来解决这个问题?

Dav*_*d W 6

我没有使用多个模式,但我发现用于映射非关键字段的方法如下:

在OrderMap中...引用(order => order.Customer).Column("CustomerName").PropertyRef("Name");

其中PropertyRef("Name")实际上是指Customer类上的Name属性(您将在CustomerMap中定义).

我刚开始使用FNH,所以你可能会找到更好的解决方案,但我希望这会有所帮助.