防止与NHibernate / FluentNHibernate进行多对多关系的级联更新

我在User类和Place类之间有一个简单的多对多关系。此关系由用户的“邻里”属性表示
public class User
{
  public virtual IList<UserPlace> Neighbourhood { get; set; }
}
UserPlace类只是一个向用户和Place之间的关系添加一条信息的组件:
public class UserPlace
{
  public virtual User User { get; set; }
  public virtual Place Place { get; set; }
  public virtual bool IsDefault { get; set; }
}
该关系映射如下:
public class UserMappings : ClassMap<User>
{
  //... other mappings

  HasMany(x => x.NeighbourHood)
            .Component(c =>
                           {
                               c.Map(x => x.IsDefault);
                               c.References(x => x.Place).Cascade.None();
                           }
            ).Not.LazyLoad().Cascade.SaveUpdate();
}
创建用户时,会从数据库中加载许多位置并将其添加到用户中,其中之一已设置为默认位置。保留用户时,关联的UserPlace实体也将保留。 我遇到的问题是,与UserPlace相关联的每个Place实体也都进行了更新。这不是理想的效果,并且我尝试通过将Cascade设置为None()来防止级联放置(双关语不是故意的)...但是,这并没有任何改变。 我仅通过指定不应该更新Place上的每个属性([PropertyName] .Not.Updated())来设法阻止了此更新。这可行,但这不是解决方案。 有人对我如何防止这种情况有任何想法吗? 编辑:Place实体映射也指定了DynamicUpdate()-因此在保存用户时,该实体确实不应更改。 PS!我认为这对这种情况没有什么影响(但是我可能错了!),但同时也要考虑一下:Place实体是在NHibernate外部加载的(使用ADO.NET和存储过程,因为有一些地理空间查询)我无法使用NHibernate),然后通过在每个实体上调用Session.Update()将其附加到会话。
已邀请:
这不是一个级联的问题。 NH更新位置,因为您在每个位置呼叫
session.Update
。您在PS中编写的内容与该问题绝对相关。 当您在一个分离的实体上调用update时,NH无法知道该实体的状态是否实际更改。为了避免在更新之前查询数据(两次数据库往返),它会盲目更新数据。 为了避免这种情况: 设置更新前选择(流利的
SelectBeforeUpdate
) 使用
session.Merge(place)
。它还在更新之前执行查询。请注意,它具有需要使用的返回值。 使用
session.Load(place.Id)
创建有问题的地点的代理并进行分配(请注意,NH在访问该代理的属性时会再次加载该地点) 使用ѭ7将对象放入会话中。 使用NH查询检索地方。

要回复问题请先登录注册