0

私は過去3日間これに参加しましたが、それでも理解できません。概念的には、エンベロープオブジェクトとそのアドレス(オブジェクト)との間を設計する必要があります。次のデータベーススキーマがあります(変更できません)。

テーブル封筒

  • EnvelopeId(PK)
  • リストアイテム
  • PostmarkDate

テーブルアドレス

  • EnvelopeId(PK、エンベロープ内のFK)
  • AdressType(1-送信元アドレスの場合、2-宛先アドレスの場合)
  • 郵便番号

*(EnvelopeId、AdressType)の一意の制約

私のクラスは次のとおりです。

public class Envelope
{
public virtual long EnvelopeId { get; set; }
public virtual DateTime PostmarkDate { get; set; }
public virtual Address FromAddress { get; set; }
public virtual Address ToAddress { get; set; }
}


public class Address
{
public virtual AddressId { get; set; }
public virtual Envelope Envelope { get; set; }
public virtual AdressType { get; set; }
public virtual Street { get; set; }
public virtual State { get; set; }
public virtual ZipCode { get; set; }
}

したがって、Envelopeには2つの対応するAddressエントリ(主キーを含む)があります。1つはAddressType 1で、もう1つはAddressType 2です。問題があるので、マッピングファイルを含めませんでした。私はいくつかの解決策を試みました:

  1. EnvelopeとAddressの間の1対1の関係。エンベロープマッピングファイルに2つの1対1のタグがあり、アドレスマッピングファイルに1対1のタグがあります。アドレスマッピングファイルには、外部ジェネレーターとエンベロープ上のconstrained="true"も含まれていました。NHibernateは、EnvelopeとAddressの間の1対1のマッピングが混乱していると不満を漏らしました。

  2. どちらもAddressから派生した2つのクラスFromAddressとToAddressを作成しました。Envelopeクラスには、(2つのアドレスではなく)FromAddressとToAddressが含まれるようになりました。継承のためにクラスごとのテーブル階層を実装しました。私の住所マッピングには、外部ジェネレーター、2つのサブクラスタグ、ディスクリミネーター値、およびエンベロープとの1対1の関係がありました。しかし、NHibernateは、ディスクリミネーターと1対1を一緒に好まないことに不満を漏らしました。そこで、サブクラスタグ内で1対1のタグを移動しました。NHibernateは、Envelopeプロパティが何であるかわからないと不平を言いました(「プロパティを解決できません:Envelope」)

どんな助けでもいただければ幸いです。

4

1 に答える 1

0

確かに、封筒は住所付きの 1 対多である必要がありますか? つまり、封筒には多くの住所を含めることができます (これにより、将来 2 つ以上の住所を使用する場合にコードが証明されます)。

ただし、マッピングを投稿していないため、(ディスクリミネーターを使用して)サブクラスごとのテーブルを取得できない理由がわかりませ ん。アドレスはエンベロープから継承されるため、アドレスからエンベロープへの双方向参照は必要ありません。

于 2013-02-26T09:13:46.753 に答える