首页 文章

流畅的NHibernate一对多插入/删除问题

提问于
浏览
0

我试图添加和删除映射为.HasMany()的列表中的元素,但nHibernate在这个简单的场景下执行一些奇怪的查询:

if (Profile.Artists.Any(x => x.Artist == artist))
{
    Profile.Artists.Remove(Profile.Artists.Single(x => x.Artist == artist));
}
else
{
   Profile.Artists.Add(new Artist { Artist = artist, User = User.Current.ID });
}

该方法使用事务执行 . 我得到的是整个集合的一系列SELECT语句:

SELECT ... WHERE artis0_.User=?p0;?p0 = 5

依此类推,然后nHibernate尝试先更新Profile,然后再将Artists更新 . 虽然艺术家实际上只能被删除或插入(注意:使用Inverse()艺术家只会插入并且永远不会被删除) .

UPDATE user_profile SET UserFK = ?p0 ...

UPDATE user_artists SET User = null WHERE User = ?p0 AND User = ?p1 AND Artist = ?p2;?p0 = 5, ?p1 = 5, ?p2 = 16

映射是这样完成的:

mapping.HasMany<Artist>(x => x.Artists)
                .KeyColumn("User")
                .Inverse()
                .Cascade.All();

这对我来说都没有任何意义,尤其是SELECT语句系列 . 我在这做错了什么?

3 回答

  • 0

    如果你想NHibernate删除孤儿使用级联模式all-delete-orphan

    mapping.HasMany<Artist>(x => x.Artists)
                .KeyColumn("User")
                .Inverse()
                .Cascade.AllDeleteOrphans();
    
  • 2

    由于你的 Any 调用,你的选择被激活,这是一个懒惰加载的集合迭代加载每个项目 .

    如果你真的需要迭代那个集合,那么你要么忍受延迟加载和选择,要么你急于加载它 .

  • 0

    显然,Profile对象存储在Web Session中,nHibernate Session存储在Items中,因此Profile自然会被分离并且正在更新,它也会更新其子节点,从而触发集合的完全重新加载 .

    解决方案是在每个请求上简单地重新加载Profile .

相关问题