私は以下のように関係を設定しようとしています。単方向の1対多の関係のNHibernateの設定
public class Detail {
public virtual Guid DetailId { get; set; }
public virtual string Name { get; set; }
}
public class Master {
public virtual Guid MasterId { get; set; }
public virtual string Name { get; set; }
public virtual IList<Detail> Details { get; set; }
}
とマッピング:各マスターアイテムが1つまたは複数の詳細項目がある
public class MasterMap : ClassMap<Master>
{
public MasterMap()
{
Id(x => x.MasterId);
Map(x => x.Name);
HasMany(x => x.Details).Not.KeyNullable.Cascade.All();
}
}
public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
}
をマスターデータベーステーブルがある:
masterId uniqueidentifier NOT NULL
name nvarchar(max) NULL
と詳細 :
DetailId uniqueidentifier NOT NULL
name nvarchar(max) NULL
MasterId uniqueidentifier NULL
foreign key (masterId) references [Master]
私は本当に戻ってマスターへのディテールからのリンクを持っている気にしない - 言い換えれば、自分で詳細オブジェクトは、ちょうど私のドメイン層に面白いではありません。 は常ににMasterオブジェクト経由でアクセスします。これはthis postに概説狂気の制限を除いて、素晴らしい作品
Master mast = new Master
{
MasterId = new Guid(),
Name = "test",
Details = new List<Detail>
{
new Detail { .DetailId = new Guid(), .Name = "Test1" },
new Detail { .DetailId = new Guid(), .Name = "Test1" }
}
};
using (transaction == Session.BeginTransaction)
{
Session.Save(mast);
transaction.Commit();
}
:NHibernateのは、INSERTを行い、最初のNULLとしてDetail.MasterIdを置き、その後にそれを設定するUPDATEを行い、このようなコードを使用して
本当のMasterId。
実際には、NULL MasterIdのディテールエントリーを望んでいないので、MasterIdフィールドをNOT NULLに設定すると、NHibernateがMasterId = NULLを入れようとしているので、DetailへのINSERTは失敗します。
私は私の質問はこれに沸く推測:私は上記のコードサンプルは、(Detail.Masterプロパティを追加することなく、例えば、)私の既存のドメインモデルで動作するように取得できますか
、およびDetail.MasterIdフィールドデータベースでNOT NULLに設定されていますか?
Nhibernateに、後でUPDATEを実行するのではなく、最初のINSERTに正しいMasterIdを入れるだけの方法はありますか?この意思決定のどこかに根拠がありますか? - なぜこのようにするのか苦労しています。
私はそれを読んでいないんでしたが、それは本当に何も説明していません(どちらも参照双方向関連の議論を行います)。この決定の背後には論理的根拠がありますか?それはnhibernateの設計上の制限ですか?バグですか?比較的初心者で、内部を全く知らないので、これが可能であるようです。 – gregmac
正直なところ、私は分かりません。それはNHibernateチームによってバグとして分類されません、それはNHibernateがどのようにエンティティを持続させるかの副作用です。私はその理由を知っているようなふりをするつもりはないが、データベースとアイデンティティジェネレーターにとらわれないこととは関係があると思う。 –
実際にキーNH3の逆=「false」をと非NULLに設定し、上記のインサートインサート更新 – hazzik