如何在NHibernate中插入项目而不加载整个集合?

如何在NHibernate中插入项目而不加载整个集合?,nhibernate,nhibernate-collections,Nhibernate,Nhibernate Collections,我的类模型如下所示: public class TheSystem { public virtual Guid Id { get; protected set; } public virtual ICollection<User> Users { get; protected set; } } public class User { public virtual Guid Id { get; protected set; } public virt

我的类模型如下所示:

public class TheSystem 
{
    public virtual Guid Id { get; protected set; }
    public virtual ICollection<User> Users { get; protected set; }
}

public class User
{
    public virtual Guid Id { get; protected set; }
    public virtual string Username { get; set; }
    ...
}
当我尝试获取项目的计数时,
extrallazyload()
选项正在按预期工作(接下来的代码只查询计数)

我还尝试添加了
.AsBag()
选项,结果相同


我在映射中缺少了一些东西,或者是一种无法用常规方法解决的情况?

您可以创建一个新用户,然后避免系统出现以下情况:

User newUser = new User();
session.Save(newUser);

如果你在做这样一个模型,很可能你正在寻找一个API表面来约束它的使用者,使他们只能执行有效的操作。当我这样做时,我通常强制执行实体的完全公共不变性。所有改变任何类型状态的公共操作都是通过建模有效业务操作的方法或对象进行中介的,这些方法或对象可以被验证和检查。然后是一个约束较少的内部API,在这个级别可以直接访问持久性机制

在这个模型中,集合作为
IEnumerable
公开在公共API表面,并映射到底层字段,我向相关控制实体添加方法来创建/添加和删除子对象(当然,前提是这是一个有效的域操作)。差不多

theSystem.AddUser(user);

虽然事实上,我的add方法很可能看起来像

theSystem.AddUser(email, password, confirmPassword, firstName, lastName)
因为我不允许API使用者直接构造任何持久化实体。
AddUser
方法构造用户,将其保存到会话中,并将其添加到用户集合中。或者如果有级联(我通常避免),只需将其添加到集合中即可


(当然,DI不能很好地工作,但这不是我在这里构建的那种API。如果有DI,它会发生在底层。)

好吧,我知道这种方法可以完成任务,但我使用的是一个持久性可及性模型和持久性忽略。所以理论上,我无法访问会话,插入必须通过引用对象或向集合中添加项来完成。我不确定持久性无知是如何发挥作用的。今天,您必须有一种保存实体的方法。使用相同的模型创建用户。不要过于沉迷于上面的例子。我是用非希伯内特语给你的。我不熟悉您现有的任何包装器。我最终选择了这种方式,检索会话并保存实例。是目前最好的选择。谢谢你的好帖子。我不确定这是否解决了不加载整个收藏的问题。当您将其添加到集合中时,它将延迟加载整个用户集合。说得好。上面我没有提到的是,对于“潜在无限”集合(我不想在任何时候加载所有集合的类型),我有一个不同的解决方案,它不涉及直接映射,因此这对我来说不是问题。但这将是我上面的解决方案。我想说的是,将“隐藏在方法后面”方法与您的建议结合起来,直接添加到会话中是最好的解决方案……顺便说一句,我在这里谈到了我的“无限集合”解决方案,如果有任何用处的话:。
User newUser = new User();
session.Save(newUser);
theSystem.AddUser(user);
theSystem.RemoveUser(user);
theSystem.AddUser(email, password, confirmPassword, firstName, lastName)