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

考えられる 1 つの方法は、これらのプロパティを読み取り専用にすることです。xml 構成 (xml マッピングは私が知っている世界です) では、次のようになります (他の 2 つの参照タイプ: 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 に答える