Fluent NHibernate一对多插入/删除问题

Fluent NHibernate一对多插入/删除问题,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我试图从映射为.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 = a

我试图从映射为.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首先尝试更新个人资料,其次尝试更新艺术家。尽管艺术家实际上只能被删除或插入(注意:使用Inverse()时,艺术家只能被插入,而不能被删除)

映射是这样完成的:

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

所有这些对我来说都毫无意义,尤其是一系列SELECT语句。我在这里做错了什么?

如果要删除孤立项,请使用级联模式“全部删除孤立项”

 mapping.HasMany<Artist>(x => x.Artists)
            .KeyColumn("User")
            .Inverse()
            .Cascade.AllDeleteOrphans();
mapping.HasMany(x=>x.Artists)
.KeyColumn(“用户”)
.Inverse()
.Cascade.alldelete孤儿();

您的选择被触发,因为您的
Any
调用正在迭代一个延迟加载的集合,并在运行时加载每个项


如果您真的需要迭代该集合,那么您要么接受延迟加载和选择,要么迫不及待地加载它。

显然,配置文件对象存储在web会话中,而nHibernate会话存储在项目中,因此配置文件自然会分离并被更新,它还更新了它的子项,触发了集合的完全重新加载

解决方案是在每次请求时简单地重新加载配置文件

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