1

我有以下票务类:

public class Ticket {
  public virtual int Id { get; set; }
  public virtual Type Type { get; set; }
  public virtual Status Status { get; set; }
  public virtual State State { get; set; }
}

映射到具有以下映射的旧数据库中的表:

public TicketMap()
{
    Table("TICKET");
    LazyLoad();
    Id(x => x.Id)
        .GeneratedBy.TriggerIdentity()
        .Column("ID")
        .Access.Property()
        .Not.Nullable();
    References(x => x.Type)
        .Class<Type>()
        .Cascade.None()
        .LazyLoad()
        .Columns("TYPE_ID");
    References(x => x.Status)
        .Class<Status>()
        .Cascade.None()
        .Columns("STATUS_ID", "TYPE_ID");
    References(x => x.State)
        .Class<State>()
        .Cascade.None()
        .LazyLoad()
        .Columns("STATE_ID", "TYPE_ID");
}

问题是当我尝试保存带有状态和状态的票证时,NHibernate 不知道要使用哪个 TYPE_ID 并且无法保存实体。

State 和 Status 类都有复合键(我知道这是一种不好的做法,但如上所述,它是旧数据库,我无法创建代理键)。

我有办法让这个参考工作吗?

4

1 回答 1

0

一种可能的方法是将这些属性设为只读。在 xml 配置中(xml 映射是我所知道的世界)它看起来像这样(其他两种 ref 类型相同:Type、State):

<many-to-one name="Status" insert="false" update="false" >
  <column name="STATUS_ID" />
  <column name="TYPE_ID" />
</many-to-one>
...

然后创建受保护的人工属性

<property name="StatusId" column="STATUS_ID" insert="true" update="true" />
<property name="StateId" column="STATE_ID" /><!-- above insert and update attr are redundant -->
<property name="TypeId" column="TYPE_ID" />

这些属性应在 Ticket 实体上声明为受保护。通过一些内部逻辑,它们可以根据选定的状态、状态或类型设置为适当的值。

我们得到的是对查询引擎的完全访问权限,因为所有 3 种引用类型都可以用于过滤。并且插入/更新也可以工作,因为 NHibernate 完全知道要使用哪个值。

于 2012-10-08T17:33:47.077 回答