中間テーブルをHasManyとしてマッピングし、中間テーブルと子の間をHasOneとしてマッピングすることで、これをペグしたと思いましたが、HasOneはキーを共有することを期待しています。(反転オプションなし:[ )
とにかく、私が持っているリレーショナル構造:
Address (子)
AddressId
..Address フィールド
AddressCustomer (中間)
AddressCustomerId
AddressId
CustomerId
Customer (親)
CustomerId
..Customer フィールド
通常の 1-many ではなく、この中間テーブルがあるのはなぜですか? アドレスを含める必要があるエンティティが他にもあるためです。(つまり、サイトなど) アドレス テーブルを共有できるように、独自の中間テーブルがあります。
私がこれまでに持っているマッピング:
public class CustomerAddressMap : ClassMap<CustomerAddress>
{
public CustomerAddressMap()
{
Schema("dbo");
Table("CustomerAddress");
Id(x => x.CustomerAddressId);
Map(x => x.FromDate)
.Not.Nullable();
Map(x => x.ToDate);
HasOne(x => x.Address)
.ForeignKey("AddressId")
.Cascade.All();
}
}
public class AddressMap : ClassMap<Address>
{
public AddressMap()
{
Schema("dbo");
Table("Address");
Id(x=>x.AddressId);
Map(x => x.AddressType);
}
}
CustomerAddress テーブルに null 許容の AddressId 列がある場合、行が挿入されますが、Address 行の AddressID は CustomerAddress に反映されません。HasOne には Inverse オプションがないため、行き止まりのようです。CustomerAddress でアドレス ID を生成することはできません。これは、SiteAddress のようなものを追加して同じことをしなければならない場合に重複が発生するためです。このトリックはGUID をキーとして機能する可能性がありますが、私は今のところ、自動インクリメントの Int にこだわっています。
私が考えていた他のアイデアは、CustomerAddress と Address のマージをマッピングすることでしたが、それが Fluent NHibby でサポートされているとは思えません。
誰かがうまく適用したのは問題のあるドメインだと思います。基本的に、子テーブル(レコードではない)が複数の親間で共有される1対多の関係が必要です。何か案は?