次のシナリオを考えてみましょう: ユーザーはスパイスのコレクションを持っており、各スパイスは「在庫あり」または「品切れ」のいずれかになります (ブール値の RunOut プロパティで示されます)。
このようなコンポーネントを使用して、この関係を FluentNHibernate とマッピングしました
public UserMappings()
{
Id(x => x.Id);
Map(x => x.FirstName);
Map(x => x.LastName);
Map(x => x.Email).Length(255).Unique();
HasOne(x => x.Credentials).Cascade.SaveUpdate().Fetch.Select();
HasMany(x => x.Spices)
.Component(c =>
{
c.Map(x => x.RunOut);
c.References(x => x.BaseSpice).Fetch.Join();
}).Table("User_Spices").Fetch.Join();
}
上記のマッピングの「Spices」コレクションは、UserSpice クラス (値オブジェクト) に対するものです。
public class UserSpice
{
public virtual Spice BaseSpice { get; protected set; }
public virtual bool RunOut { get; protected set; }
public static UserSpice Create(Spice baseSpice, bool runOut)
{
var userSpice = new UserSpice {BaseSpice = baseSpice, RunOut = runOut};
return userSpice;
}
}
これは「問題なく」動作しますが、いずれかのコンポーネントを更新すると (たとえば、スパイスを RunOut = true に変更すると)、すべてのユーザーのスパイスが削除され、再挿入されます。
NHibernate には、どのユーザー スパイス参照を更新する必要があるかを一意に識別する方法がないため、これが発生していることは理解しています。
この削除と再挿入の動作を回避するために、これを別の方法でモデル化するにはどうすればよいですか?