是否可以使用NHibernate将多个表映射到单个域模型?

是否可以使用NHibernate将多个表映射到单个域模型?,nhibernate,mapping,union,Nhibernate,Mapping,Union,是否可以使用NHibernate将多个表映射到单个域模型?它基本上是一个联合体,如下图所示,但我不确定如何用C实现域模型和NHibernate的映射 我基本上有1个抽象类和2个具体类。每个具体类都可以映射到数据库中的单个表 SQL语句: SELECT * FROM InCompleOrders UNION SELECT * FROM CompleteOrders 目前我正在这样做: C域模型: public enum Status { InComplete = 1,

是否可以使用NHibernate将多个表映射到单个域模型?它基本上是一个联合体,如下图所示,但我不确定如何用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>
我想避免做以下事情:

我希望能够做到以下几点:


您是否考虑过使用[视图][1]

您可以按如下方式定义视图:

CREATE VIEW AllOrders AS
  SELECT CompleteOrderId
         , Status 
  FROM   CompleteOrders 
  WHERE  Reference = 'abc'

  UNION

  SELECT InCompleOrderId 
         , 1 AS 'Status'
  FROM   InCompleOrders 
  WHERE  Reference = 'abc'
从Hibernate和大概是NHibernate的角度来看,AllOrders只是将域对象映射到的另一个表

一个警告是,您将无法执行视图的插入更新可能有效,也可能无效,我不确定。因此,如果您需要执行写操作,您可能仍然需要独立地映射到CompleteOrders和UncompleteOrders


编辑:看来我搞错了,不能在视图中插入数据-

是的,有许多选项可供您选择。Ayende Rahien对表继承和生成的表结构有一个定义

使用具有抽象BaseOrder的类层次结构作为CompleteOrder和IncompleToOrder的父级,联合用例为:

<class name="CompleteOrder" table="CompleteOrders">
    <id name="Id">
        <generator class="identity"/>
    </id>
    <property name="Status"/>
</class>

<class name="IncompleteOrder" table="IncompleteOrders">
    <id name="Id">
        <generator class="identity"/>
    </id>
</class>

它也有单独的表,但不使用联合进行查询

看看这个,它可能会有很大帮助

编辑:

曾有评论说不想出演,但现在已经不见了。我不确定它是否被删除,或者它是否是一个如此严重的问题

如果BaseOrder.Status是一个虚拟属性,那么您应该能够传递BaseOrder,而不需要强制转换。您必须维护额外的类层次结构,但仍然可以一起查询它们,并且在大多数情况下,应用程序的其余部分不需要知道子类


祝你好运

我确实阅读了链接,但是我发现在给定的示例中,有一个抽象类的表,名为“Parties”,在我的例子中,我没有这个表。强制转换的问题是,如果我在children类uncompleteOrder和Order中有不同的属性,那么我需要在两者之间进行强制转换。但是我不认为有什么可以解决的。嗨,杰弗里,有两个例子有一个基表,两个没有基表。看看第二个和第四个例子。谢谢你对我有耐心。我这里有第二个例子作为开始。链接现在断开了
CREATE VIEW AllOrders AS
  SELECT CompleteOrderId
         , Status 
  FROM   CompleteOrders 
  WHERE  Reference = 'abc'

  UNION

  SELECT InCompleOrderId 
         , 1 AS 'Status'
  FROM   InCompleOrders 
  WHERE  Reference = 'abc'
<class name="CompleteOrder" table="CompleteOrders">
    <id name="Id">
        <generator class="identity"/>
    </id>
    <property name="Status"/>
</class>

<class name="IncompleteOrder" table="IncompleteOrders">
    <id name="Id">
        <generator class="identity"/>
    </id>
</class>
 <class name="BaseOrder" abstract="true" table="Orders">
    <id name="Id">
        <generator class="hilo"/>
    </id>

    <union-subclass table="CompleteOrders" name="CompleteOrder">
        <property name="Status"/>
    </union-subclass>

    <union-subclass table="IncompleteOrders" name="IncompleteOrder">
    </union-subclass>
</class>