考虑以下场景:用户有一组香料,每个香料可以是“有货”或“用完”(由布尔 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 无法唯一标识它应该更新的用户香料引用。
如何以不同的方式对此进行建模以避免这种删除并重新插入行为?