防止与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()将其附加到会话。
没有找到相关结果
已邀请:
1 个回复
篮肥炼皖
。您在PS中编写的内容与该问题绝对相关。 当您在一个分离的实体上调用update时,NH无法知道该实体的状态是否实际更改。为了避免在更新之前查询数据(两次数据库往返),它会盲目更新数据。 为了避免这种情况: 设置更新前选择(流利的
) 使用
。它还在更新之前执行查询。请注意,它具有需要使用的返回值。 使用
创建有问题的地点的代理并进行分配(请注意,NH在访问该代理的属性时会再次加载该地点) 使用ѭ7将对象放入会话中。 使用NH查询检索地方。