Можно ли сопоставить несколько таблиц с одной моделью домена с помощью NHibernate? По сути, это UNION, что-то вроде того, что показано ниже, но я не уверен, как создавать модели предметной области на C # и сопоставления NHibernate.
В основном у меня есть 1 абстрактный класс и 2 конкретных класса. Каждый конкретный класс можно сопоставить с одной таблицей в базе данных.
Оператор SQL:
SELECT *
FROM InCompleOrders
UNION
SELECT *
FROM CompleteOrders
В данный момент я делаю так:
Модели предметной области C #:
public enum Status
{
InComplete = 1,
Pending = 2,
Complete = 3
}
public abstract class BaseOrder : Entity
{
public string Property1 {get;set;}
public string Property2 {get;set;}
public string Property3 {get;set;}
public Status Status {get;set;}
public string Reference {get;set;} //this is unique
}
public class InCompleteOrder : BaseOrder
{
public override Status Status
{
get { return Status.InComplete; }
}
}
public class Order : BaseOrder
{
public DateTime DeliveredOn {get;set;}
public DateTime PaidOn {get;set;}
}
Таблицы базы данных:
InCompleOrders table
InCompleOrderId INT PK
Property1 varchar(255) NULL
Property2 varchar(255) NULL
Property3 varchar(255) NULL
CompleteOrders table
CompleteOrderId INT PK
Status INT
Property1 varchar(255) NOT NULL
Property2 varchar(255) NOT NULL
Property3 varchar(255) NOT NULL
DeliveredOn datetime NOT NULL
PaidOn datetime NOT NULL
Отображение NHibernate:
<class name="Order" table="CompleteOrders">
<id name="Id" column="CompleteOrderId" type="int">
<generator class ="hilo"></generator>
</id>
<property name="DeliveredOn" column="DeliveredOn" not-null="true" type="DateTime" />
<property name="PaidOn" column="PaidOn" not-null="true" type="DateTime" />
<property name="Property1" column="Property1" not-null="true" type="string" />
<property name="Property2" column="Property2" not-null="true" type="string" />
<property name="Property3" column="Property3" not-null="true" type="string" />
</class>
<class name="InCompleteOrder " table="InCompleOrders">
<id name="Id" column="InCompleOrderId" type="int">
<generator class ="hilo"></generator>
</id>
<property name="Property1" column="Property1" not-null="false" type="string" />
<property name="Property2" column="Property2" not-null="false" type="string" />
<property name="Property3" column="Property3" not-null="false" type="string" />
</class>
Я не хочу делать такие вещи, как:
public BaseOrder GetByReference (string reference)
{
BaseOrder bo;
var repoOrder = new Repository<Order>();
bo = repoOrder.FindOne(query);
//query = Restrictions.Eq("Reference", reference)
if (bo == null)
{
var repoInCompOrder = new Repository<InCompleteOrder>();
bo = repoInCompOrder.FindOne(query);
//query = Restrictions.Eq("Reference", reference)
}
return bo;
}
И я хочу уметь:
public Order GetByReference (string reference)
{
var repoOrder = new Repository<Order>();
var bo = repoOrder.FindOne(query);
//query = Restrictions.Eq("Reference", reference) //reference = "abc"
//and this will generate a SQL similar to:
//
//SELECT CompleteOrderId
// , Status
//FROM CompleteOrders
//WHERE Reference = 'abc'
//
//UNION
//
//SELECT InCompleOrderId
// , 1 AS 'Status'
//FROM InCompleOrders
//WHERE Reference = 'abc'
return bo;
}