Свободное отображение NHibernate (один к одному с условным) - PullRequest
1 голос
/ 01 декабря 2010

Я пытаюсь «очистить» плохо спроектированную структуру базы данных (по крайней мере, в моем ORM).

Структура таблицы выглядит примерно так:

Table: Members
memberID (int PK)
username (varchar)

Table: Addresses
addressID (int PK)
memberID (int, not set as a FK - awesome)
firstName (varchar)
lastName (varchar)
addressLine1 (varchar)
isBillingAddress (bit)

Итак, я создал2 класса (сущности), один для клиента и один для адреса.

public class Customer
{
    public virtual int CustomerID { get; set; }
    public virtual string FirstName
    {
        get { return BillingAddress.FirstName; }
        set { BillingAddress.FirstName = value; }
    }
    public virtual string LastName
    {
        get { return BillingAddress.LastName; }
        set { BillingAddress.LastName = value; }
    }
    public virtual Address BillingAddress { get; set; }
    public virtual Address ShippingAddress { get; set; }
}

public class Address
{
    public virtual Customer Customer { get; set; }
    public virtual int AddressID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string AddressLine1 { get; set; }
    public virtual string AddressLine2 { get; set; }
    public virtual string City { get; set; }
    public virtual string State { get; set; }
    public virtual string PostalCode { get; set; }
}

Запрос на получение платежного адреса клиента будет выглядеть следующим образом:

SELECT TOP 1 *
FROM dbo.Address
WHERE isBilling = 1
AND memberID = @memberID

Должен быть только 1 биллинги адрес доставки для каждого клиента.Пока что моя беглая карта классов выглядит следующим образом:

public class CustomerMapping : ClassMap<Customer>
{
    public CustomerMapping()
    {
        Table("Members");

        Id(m => m.CustomerID).Column("memberID");
        Map(m => m.BillingAddress);

        HasOne(x => x.BillingAddress).PropertyRef("memberID");
        HasOne(x => x.ShippingAddress).PropertyRef("memberID");
    }
}

Я не уверен, стоит ли мне даже использовать HasOne ... это должно быть сопоставление один к одному.Как я могу получить предложение "где" (IE WHERE Address.memberID = Members.customerID), чтобы различать выставление счетов и доставку?Кроме того, как насчет топ 1?Я знаю, что могу, возможно, использовать Join, но я не вижу беглой функции для добавления предложения where.

Изменение структуры базы данных, к сожалению, не вариант.

Спасибо

1 Ответ

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

Вам не нужен HasOne (), хотя это звучит правильно.HasOne () означает, что таблицы совместно используют первичные ключи.Вместо этого используйте ссылки ().

...