私は過去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です。問題があるので、マッピングファイルを含めませんでした。私はいくつかの解決策を試みました:
EnvelopeとAddressの間の1対1の関係。エンベロープマッピングファイルに2つの1対1のタグがあり、アドレスマッピングファイルに1対1のタグがあります。アドレスマッピングファイルには、外部ジェネレーターとエンベロープ上のconstrained="true"も含まれていました。NHibernateは、EnvelopeとAddressの間の1対1のマッピングが混乱していると不満を漏らしました。
どちらもAddressから派生した2つのクラスFromAddressとToAddressを作成しました。Envelopeクラスには、(2つのアドレスではなく)FromAddressとToAddressが含まれるようになりました。継承のためにクラスごとのテーブル階層を実装しました。私の住所マッピングには、外部ジェネレーター、2つのサブクラスタグ、ディスクリミネーター値、およびエンベロープとの1対1の関係がありました。しかし、NHibernateは、ディスクリミネーターと1対1を一緒に好まないことに不満を漏らしました。そこで、サブクラスタグ内で1対1のタグを移動しました。NHibernateは、Envelopeプロパティが何であるかわからないと不平を言いました(「プロパティを解決できません:Envelope」)
どんな助けでもいただければ幸いです。