如何在两个名称不匹配的非键属性上在Fluent Nhibernate中创建连接?

时间:2011-06-30 19:52:12

标签: fluent-nhibernate

我的遗留数据库中有两个表

购买

  • Id int(PK)
  • name varchar(50)
  • MasterAccount char(10)
  • BuyerAccount char(10)

MasterAccounts

  • Id int(PK)
  • 名称varchar(50)
  • MasterAccountNumber char(10)
  • AccountNumber char(10)

我有一个将1:1映射到购买表的对象。我想添加"名称"从MasterAccounts表到购买对象的列作为属性。

如果我要加入两个列,我如何告诉Fluent Nhibernate执行连接:

  1. 未在数据库中定义为外键
  2. 每张表中的名称不一致
  3. 查看我想要生成的SQL可能会有所帮助。

    Select Purchases.*, MA.Name
    from Purchases
    left join MasterAccounts MA
    on 
    MA.MasterAccountNumber = Purchases.MasterAccount
    and
    MA.AccountNumber = Purchases.BuyerAccount
    

2 个答案:

答案 0 :(得分:1)

假设 Purchases 中的MasterAccount字段与 MasterAccounts 中的MasterAccountNumber匹配...在表格格式的sql中创建视图正试图映射:

CREATE VIEW [dbo].[v_PurchaseMasterAccountName]
AS
SELECT     dbo.Purchases.Id, dbo.Purchases.Name, dbo.Purchases.MasterAccount, dbo.Purchases.BuyerAccount, dbo.MasterAccounts.Name AS MasterAccountName
FROM         dbo.MasterAccounts INNER JOIN
                      dbo.Purchases ON dbo.MasterAccounts.MasterAccountNumber = dbo.Purchases.MasterAccount

创建一个ClassMap来映射你的视图:

public class Purchase
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string MasterAccountName { get; set; }
    public virtual string MasterAccount { get; set; }
    public virtual string BuyerAccount { get; set; }
}

public class PurchaseClassMap : ClassMap<Purchase>
{
    public PurchaseClassMap()
    {
        Table("v_PurchaseMasterAccountName");
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.MasterAccount);
        Map(x => x.BuyerAccount);
        Map(x => x.MasterAccountName);
    }
}

确保在FluentMappings中选择了ClassMap。

<强>更新

这可能会改为:

public class PurchaseMap : ClassMap<Purchase>
{
    public PurchaseMap()
    {
        Table("Purchases");
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.MasterAccount);
        Map(x => x.BuyerAccount);
        Map(x => x.MasterAccountName).ReadOnly()
            .Formula("(SELECT TOP 1 MasterAccounts.Name FROM MasterAccounts WHERE MasterAccounts.MasterAccountNumber = [MasterAccount] AND MasterAccounts.MasterAccountNumber = [BuyerAccount])");

    }
}

感谢Darren Kopp指向公式选项的指针。

答案 1 :(得分:0)

这是一个不寻常的问题,可能还有其他选择,但这是我的几个想法。

  1. Use a formula。该属性不可更新,但在您的情况下,我认为这很好(标记属性为只读)。
  2. 我认为您必须为此执行hbm.xml文件,但您可以use your own query for the loader query in nhibernate
  3. 弄清楚JoinPart上的Subselect在流利的nhibernate中做了什么?怀疑这会有用,但值得一试