NHibernate で新しい Map by Code ピースを使用しています。私の理解では、NHibernate 3 で更新が行われたため、コレクションに inverse=false を設定して作成した限り、単方向の 1 対多の関係が外部キーに null を挿入し、それを正しい値に更新することはなくなりました。外部キーはヌル可能ではありません。
私が見ているのは、NHibernate が正しい外部キーを INSERT するようになったことですが、外部キーを挿入で使用された値に設定する追加の UPDATE をまだ発行していますか?!?
マッピングで何か間違ったことをしましたか? (ユーザーは多数のパスワードを持つことができます。パスワード オブジェクトは、ドメイン内のユーザーを参照しません。)
mapper.Class<Password>(map =>
{
map.Table("Passwords");
map.Id(x => x.Id, x => { x.Generator(Generators.Native); x.Column("PasswordId"); });
map.Property(x => x.PasswordFormat, x => { x.NotNullable(true); });
map.Property(x => x.Salt, x => { x.Length(100); });
map.Property(x => x.PasswordValue, x => { x.NotNullable(true); x.Length(500); });
map.Property(x => x.CreateDate, x => { x.NotNullable(true); });
});
mapper.Class<User>(map =>
{
map.Table("Users");
map.Id(x => x.Id, x => { x.Generator(Generators.Native); x.Column("UserId"); });
map.Property(x => x.UserName, x => { x.NotNullable(true); x.Length(100); x.UniqueKey("UX_Users_Username"); });
map.Property(x => x.Email, x => { x.Length(100); x.Index("IX_Users_Email"); });
map.Property(x => x.IsAnonymous, x => { x.NotNullable(true); });
map.Property(x => x.IsApproved, x => { x.NotNullable(true); });
map.Property(x => x.LastActivityDate, x => { x.NotNullable(true); });
map.Property(x => x.CreateDate, x => { x.NotNullable(true); });
map.Set(x => x.Passwords, x => { x.Access(Accessor.Field); x.Inverse(false); x.Key(k => { k.Column("UserId"); k.NotNullable(true); k.ForeignKey("FK_Passwords_UserId"); }); x.Cascade(Cascade.All); x.Lazy(CollectionLazy.Lazy); }, x => x.OneToMany());
});
注:これは、Fluent NHibernate ではなく、組み込みの NHibernate.Mapping.ByCode を使用しています。