Свободное владение NHibernate с ограничением - PullRequest
4 голосов
/ 30 ноября 2009

У меня есть сущность, свойства которой распределены по двум таблицам, которые я хотел бы отобразить в один класс с помощью Fluent NHibernate, но с ограничением на присоединяющуюся таблицу.

Я изменил домен моей проблемы, чтобы этот вопрос стал семейным доменом «клиента», поэтому мой пример здесь может показаться немного надуманным, но это иллюстрирует мою проблему. это в основном это; у меня есть таблица Customer, в которой есть некоторые атрибуты клиента, но имя и фамилия клиента хранятся в отдельной таблице CustomerName как две строки, связанные с клиентом и идентифицируемые как имя и фамилия.

ниже приведена схема таблицы:

CREATE TABLE Customer ( CustomerId int, Дата рождения )

CREATE TABLE CustomerName ( CustomerId int NOT NULL, CustomerNameTypeId int NOT NULL, Имя nvarchar (25) НЕ NULL )

CREATE TABLE CustomerNameTypes ( CustomerNameTypeId NOT NULL, Описание nvarchar (25) NOT NULL )

с таблицей CustomerNameTypes, содержащей две строки: 1, «FirstName» 2, «Второе имя»

мне нужен Fluent Mapping, который сопоставит вышеприведенное со следующим:

public class Customer
{
    public virtual int CustomerId { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual DateTime Birthday { get; set; }
}

кто-нибудь может помочь?!

большое спасибо заранее Крис Браун

Ответы [ 3 ]

1 голос
/ 02 декабря 2009

Не могу ответить на этот вопрос с помощью nHibernate, но у меня есть несколько других вариантов, которые могут помочь вам решить его!

  1. Лично я бы переписал sql следующим образом:

    select 
          c.CustomerId, 
          c.Birthday, 
          fn.Name, 
          ln.Name
    from Customer c
    left join CustomerName fn on c.CustomerId = fn.CustomerId
    left join CustomerNameTypes fnt on fnt.CustomerNameTypeId = fn.CustomerNameTypeId
          and fnt.[Description] = 'First'
    left join CustomerName ln on c.CustomerId = ln.CustomerId 
    left join CustomerNameTypes lnt on lnt.CustomerNameTypeId = ln.CustomerNameTypeId
          and lnt.[Description] = 'Last'
    

    Это может помочь вам решить, все еще используя NHibernate.

  2. Другой вариант - использовать вид. Я лично использую LLBLGenPro, и до того, как Linq был доступен в v2.6, он был моим любимым методом быстрого и простого решения сложных запросов.

  3. Я думаю, это будет сложно, особенно если у вас упрямый администратор баз данных или сторонний администратор баз данных !! Денормализовать базу данных. Эта структура слишком нормализована и является единственной причиной, по которой вы сталкиваетесь с этой проблемой.

В любом случае, я знаю, что это не является решением вашей проблемы, но я надеюсь, что вы извлечете из этого пользу !! :)

1 голос
/ 02 декабря 2009

Я знаю, что это не совсем отвечает на ваши вопросы, но ...

Если бы LastName и FirstName были в одной строке таблицы CustomerName (но это не так), это можно сделать с помощью сопоставления . Айенде описывает это отображение HBM в своем блоге. Вот хороший пример этого: Сущность, охватывающая несколько таблиц . С тех пор имя метода изменилось с WithTable () на Join (). Вот как это будет выглядеть:

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap()
    {
        Id(x => x.CustomerId);
        Join("CustomerName", m =>
        {
            m.Map(x => x.FirstName);
            m.Map(x => x.LastName);
        });
        // ... other properties ...
    }
}

Я пока не уверен, как решить проблему с двумя именами в отдельных строках.

0 голосов
/ 30 ноября 2009

только что подумал, я бы добавил, это эквивалентно sql:

select c.CustomerId, c.Birthday, fn.Name, ln.Name
from Customer c
  left join CustomerName fn on c.CustomerId = fn.CustomerId and fn.CustomerNameTypeId = (select CustomerNameTypeId from CustomerNameTypes where Description = 'First')
  left join CustomerName ln on c.CustomerId = ln.CustomerId and ln.CustomerNameTypeId = (select CustomerNameTypeId from CustomerNameTypes where Description = 'Last')

ура! * * 1004

...