3

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 を使用しています。

4

2 に答える 2

2

k.Update(false)これは、Passwords コレクション マッピングの外部キー部分を設定することで実現できることがわかりました。

次の質問に対する hazzik からの回答は、私を待ち行列に入れました。

https://stackoverflow.com/a/11576097/139694

于 2012-12-17T23:23:06.937 に答える
1

Inverse(false) ではなく、Inverse() である必要があります。

Inverse() は、他のエンティティが関係を所有しており、情報を挿入/更新しながら関係に関するデータを NHibernate に提供する責任があることを意味します。つまり、「ユーザー」が逆に設定されている場合、「パスワード」は関係情報の提供を処理する必要があります。 . Hibernate に。

このためには、"Password" エンティティに "User" 参照プロパティを設定する必要があります。また、パスワードの作成/更新中に、ユーザー プロパティを明示的に割り当てます。

//create new password
Password objPassword = new Password();
objPassword.otherproperties =///assign
objPassword.User = <<---assign the user property

現在、NHibernate のデフォルト設定である Inverse(false) があります。この場合、insert ステートメントは passwordid を null として実行され、参照が更新されて 2 つの操作が行われます。

于 2012-12-17T22:22:55.390 に答える