阻止NHibernate尝试删除关联集合

阻止NHibernate尝试删除关联集合,nhibernate,wcf-ria-services,Nhibernate,Wcf Ria Services,我正在将NHibernate与RIA服务一起使用,以下关联给我带来了问题 User hasMany UserRoleGrants via the property user.Roles 当我尝试更新我的用户时,silverlight客户端将用户实体传递到服务层,但没有填充Roles属性(这似乎是合理的,因为它可能是一个大型集合,所以为什么要通过网络来回发送它)。这导致NHibernate尝试删除此用户的UserRoleGrants 感觉上我想做一个与session.Load等效的操作,但只针对

我正在将NHibernate与RIA服务一起使用,以下关联给我带来了问题

User hasMany UserRoleGrants via the property user.Roles
当我尝试更新我的用户时,silverlight客户端将用户实体传递到服务层,但没有填充Roles属性(这似乎是合理的,因为它可能是一个大型集合,所以为什么要通过网络来回发送它)。这导致NHibernate尝试删除此用户的UserRoleGrants

感觉上我想做一个与session.Load等效的操作,但只针对user.Roles属性,而不是整个对象

我怎样才能做到这一点

编辑:这是我的流畅映射

public UserMap()
{
    Id(x => x.Id).GeneratedBy.HiLo("10000");
    Map(x => x.UserName).Unique().Not.Nullable().Length(255).Default(string.Empty);

    HasMany(x => x.RoleGrants).KeyColumn("User_id").Cascade.None().Access.CamelCaseField().LazyLoad();
}

谢谢

您可能不应该让实体跨越服务边界。改为使用一些DTO并将其发送到服务。此问题可能会有所帮助:

如果要初始化集合,可能需要使用NHibernateUtil.initialize()(请参阅第16.1.4节)。
但是,如果您没有在任何地方使用该集合,则加载它不是一个好主意。

您是否考虑过将关系设置为非级联关系?

通常,我们使用DTO与服务层进行通信


如果从数据库中获取用户,更新字段并保存,则不会干扰角色集合。它是延迟加载且未更改的,因此不会被删除。

它实际上是一个DTO,因为服务只是将其序列化并反序列化到生成的代理中。@BenCR您似乎将其视为常规实体。一旦进入服务器,您应该从ne会话读取用户并通过DTOAhh进行更新,好吧,那么看来我们使用NHibernate的方式可能不被认为是“最佳实践”?你知道关于通过服务使用NHibernate的最佳实践文章吗?@Ben我修改了回复,并添加了指向上的另一个问题的链接,这样可以帮助我添加映射以显示关联是级联的。None()