2011-02-14 1 views
0

私は今、私はそれをユーザオブジェクトを与える必要があり、設定を保存するたびにそう、私はFluent Nhibernateで参照をNullableにしないといけませんか?

-nullでないプロパティがnullを参照してもらう私の地図

public class Settings : ClassMap<Setting> 
{ 
    References(x => x.User).Not.Nullable(); 
} 

でこのような何かを持っていますまたは 一時的な値

私は、これを実行することによって、リレーショナル制約を適用すると考えました。しかし、実際にはFkを使うだけで、オブジェクト全体を渡さなければならないのは変です。

内部的にすべてを再保存しておらず、Fkを追加してリレーショナル制約を保持するだけでいいと思います。

私はこれを正しい方法で行いますか?

編集

public class Settings : ClassMap<Setting> 
{ 
     Id(x => x.SettingId); 
     Map(x => x.Something); 
     Map(x => x.Something2); 
     References(x => x.User).Not.Nullable(); 
} 


Public class User: ClassMap<User> 
{ 
    Id(x => x.UserId); 
    Map(x => x.FirstName); 
    Map(x => x.LastName); 
    HasOne(x => x.Settings); 
    HasMany(x => x.AnotherTable); 
} 


Settings s = new Settings() 
{ 
     Something = "142", 
     Something2 = "1421414" 
}; 

session.Create(s); // this will crash as s.User equals null; 

私は、ユーザー=ユーザーなかったので、私は疑問に思って今、この

User user = repo.GetUser("userId"); 

Settings s = new Settings() 
{ 
     Something = "142", 
     Something2 = "1421414", 
     User = user 
}; 

session.Create(s); // this should work. 

を行う必要があります。 nhibernateはuserIdを取得してSettingsタブに保存するのですか?それともユーザーテーブルに変更がないかチェックして、変更の「別のテーブル」をチェックしますか?

また、ユーザーテーブルと別のテーブルのすべてのフィールドを点滅更新しますか?

これは、オブジェクト全体を保存していることを意味していると思いますか?

+0

「nullでないプロパティ参照がnullまたは一時的な値」で失敗するテストを投稿することができますので、あなたは何をやっているのか、あなたは何を期待していますか? –

答えて

1

いいえ、ユーザーオブジェクトを再保存/更新しません。それはそれがIdであり、Fk Columnを更新するだけです。舞台裏で何が起こっているのかわからない場合は、SQL Server Profiler(DBがMSSQLの場合)またはNHibernate Profilerを使用してみてください。

ちなみに、これはayende's postにチェックしてください。NHibernateのセーブ/アップデート/カスケードの異なる方法について教えてください。

+0

Ok cool。可能であれば、.Loadを使うべきだと思います。 – chobo2

+0

私はオブジェクトを既に持っていれば私はそのUser = user;私ができるなら、私はいつもLoadを使うべきですか? – chobo2

+0

はい、これはそれが意味するところです。あなたはIdだけを持っていて、このIdが有効であることを知っているときだけ '.Load'を使うべきです。 – goenning

2

.Not.Nullable()を使用してNHibernateにこのプロパティのヌルを検証するように指示しています。

もちろん、nullの場合は適切なメッセージで通知します。

あなたはそれがNULL可能にしたい場合は...ただそれ以外:-)

更新、それを教えていない:私はまだあなたの懸念が何であるかを理解する問題を抱えています。 Userインスタンスを取得した場合(実際にはIdを持っていればDBに行く必要はなく、ただsession.Loadを使用します)、プロパティを変更しないでください。なぜNHibernateはそれを "再保存"しますか?

+0

私はそれが間違った価値だとは思わない。私が保存しようとしているオブジェクトには、Nullオブジェクトのオブジェクトが含まれているのは単なる怒ったことだと思います。私はそれをユーザーに与えると、それはそれを保存します。私は既にロードされているユーザーを持っていますが、新しい設定レコードを挿入していて、既存の設定レコードを更新していないため、設定オブジェクトが私によって作成されていて、nhibernateによって作成されていないため、私は行くことができ、ユーザーオブジェクトに設定オブジェクトを追加して保存することができますが、私はこのようにそれについて行く方法が不思議です。 – chobo2

+0

@ chobo2編集を参照してください。 –

+0

@ chobo2「オブジェクト全体を再保存する」とはどういう意味ですか?実際のコードを投稿できますか? –

関連する問題