Как создать объединение в Fluent Nhibernate для двух неключевых свойств, имена которых не совпадают? - PullRequest
3 голосов
/ 30 июня 2011

У меня есть две таблицы в моей прежней базе данных

Покупки

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

MasterAccounts

  • Id int (PK)
  • Имя varchar (50)
  • MasterAccountNumber char (10)
  • AccountNumber char (10)

У меня есть объект, который отображает 1: 1 в таблицу покупок.Я хочу добавить столбец «Имя» из таблицы MasterAccounts к объекту покупок в качестве свойства.

Как сказать Fluent Nhibernate выполнить соединение, когда два столбца, к которым я хочу присоединиться:

  1. не определены как внешние ключи в базе данных
  2. Не иметь одинаковые имена в каждой таблице

Может быть полезно увидеть нужный мне SQLгенерировать.

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

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Предполагая, что поле MasterAccount в Закупки соответствует MasterAccountNumber в MasterAccounts ... создать представление в sql с форматом таблицы, который вы пытаетесь отобразить: 1007 *

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);
    }
}

Убедитесь, что ваша ClassMap подобрана в ваших FluentMappings.

UPDATE:

Это может работать вместо:

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])");

    }
}

Спасибо Даррену Коппу за указатель на опцию Формулы.

0 голосов
/ 01 июля 2011

Это довольно необычный вопрос, и вполне могут быть и другие варианты, но вот моя пара идей.

  1. Используйте формулу . Свойство не может быть обновлено, но в вашей ситуации я думаю, что это нормально (пометить свойство как только для чтения).
  2. Я думаю, для этого вам понадобится файл hbm.xml, но вы можете использовать свой собственный запрос для запроса загрузчика в nhibernate .
  3. Выясните, что Subselect на JoinPart делает в беглом nhibernate? Сомневаюсь, что это сработает, но стоит попробовать
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...