【问题标题】:Preventing a cascading update of a many-to-many relationship with NHibernate/FluentNHibernate,防止与 NHibernate/FluentNHibernate 的多对多关系的级联更新,
【发布时间】:2011-04-20 00:49:12
【问题描述】:

我在 User 类和 Place 类之间有一个简单的多对多关系。这种关系由用户的“邻居”属性表示

public class User
{
  public virtual IList<UserPlace> Neighbourhood { get; set; }
}

UserPlace 类只是一个向用户和地点之间的关系添加一条信息的组件:

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() 来阻止 Cascade to Place 发生(双关​​语不是故意的)......但这并没有改变任何东西。

我只是通过指定不应更新 Place 上的每个属性 ([PropertyName].Not.Updated()) 来阻止此更新的发生。这可行,但不是解决方案。

有人对我如何防止这种情况发生有任何想法吗?

编辑:Place 实体映射也指定了 DynamicUpdate() - 所以当用户被保存时实体真的不应该改变。

PS!我认为这对这种情况没有影响(但我可能错了!),但也要考虑一下:Place 实体是在 NHibernate 之外加载的(使用 ADO.NET 和存储过程,由于某些地理空间查询,我无法使用 NHibernate 进行),然后通过在每个实体上调用 Session.Update() 将其附加到会话。

【问题讨论】:

    标签: c# .net nhibernate fluent-nhibernate nhibernate-cascade


    【解决方案1】:

    这不是级联问题。 NH 会更新这些地点,因为您在每个地点都调用session.Update。你在PS里写的绝对和问题有关。

    当您对分离的实体调用更新时,NH 无法知道实体的状态是否实际发生了变化。为了避免在更新之前查询数据(两次数据库往返),它会盲目地更新数据。

    为了避免这种情况:

    • 设置更新前选择(SelectBeforeUpdate 流畅)
    • 使用session.Merge(place)。它还在更新之前执行查询。请注意,它有一个需要使用的返回值。
    • 使用session.Load(place.Id) 创建相关地点的代理并分配它(请注意,NH 在访问代理属性时会再次加载该地点)
    • 使用session.Lock(place, LockMode.None) 将对象放入会话中。
    • 使用 NH 查询检索 Places。

    【讨论】:

    • 您好 Stefan,这是一个绝妙的答案。谢谢你。我有一种感觉,这不是一个级联问题(我在这里发帖后一直在阅读它),你现在让我更清楚地了解这里发生了什么。在通过其他方式找到他们的 ID 后,我通过 NHibernate 加载我的 Place 实体解决了这个问题。这有点 hacky,但目前我没有 NHibernate-y 方式来执行我的空间查询。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多