Я пытаюсь «очистить» плохо спроектированную структуру базы данных (по крайней мере, в моем 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.
Изменение структуры базы данных, к сожалению, не вариант.
Спасибо