Nhibernate 从集合中删除而不加载所有集合数据。不知道要使用哪个集合映射

Nhibernate 从集合中删除而不加载所有集合数据。不知道要使用哪个集合映射,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,分配和用户之间存在多对多关系 当尝试从分配中删除用户时,我看到所有用户都已加载到集合中 我如何避免这种情况 public class User { public virtual int Id { get; private set; } public virtual IList<Assignment> Assignments { get; set; } } public class Assignment { public virtual int Id { get; p

分配和用户之间存在多对多关系

当尝试从分配中删除用户时,我看到所有用户都已加载到集合中

我如何避免这种情况

public class User
{
  public virtual int Id { get; private set; }
  public virtual IList<Assignment> Assignments { get; set; }
}


public class Assignment
{
   public virtual int Id { get; private set; }
   public virtual ICollection<User> Users { get; set; }
}
呼叫代码:

assignment.Users.Remove(user)
最初我使用Bag而不是Set来进行分配映射,但在更新它时,它会删除并重新插入AssignmentsToUsers表中的许多行。所以我改用Set

但现在我看到了使用Set的一个问题:它将所有数据都放在内存中


推荐的方法是什么?

您也应该对Assignment.Users使用额外的惰性模式。

您也应该对Assignment.Users使用额外的惰性模式。

您无法避免这一点,如果性能可以接受,我将忽略它。如果性能是一个问题,我可以想出三种方法来解决它:

  • 如果集合的另一侧(User.Assignments)较轻,则从用户处删除分配
  • 对多对多表建模并直接删除对象。您必须确保在此之前不会加载Users集合,因为内存中的表示仍将包含已删除的记录
  • 使用SQL直接删除——这与#2具有相同的警告

  • 您无法避免这种情况,如果性能可以接受,我将忽略它。如果性能是一个问题,我可以想出三种方法来解决它:

  • 如果集合的另一侧(User.Assignments)较轻,则从用户处删除分配
  • 对多对多表建模并直接删除对象。您必须确保在此之前不会加载Users集合,因为内存中的表示仍将包含已删除的记录
  • 使用SQL直接删除——这与#2具有相同的警告

  • 我不认为这是问题所在。请纠正我,但我了解到集合需要内存中的数据才能实际插入新项。这是因为集合类上的Add方法返回一个值。这就是集合的实际工作方式。是的,可能是额外的惰性只适用于索引集合(列表和映射),但我不确定。我有点失望,因为我没有得到任何结论性的答案。我不认为这是问题所在。请纠正我,但我读到集合需要内存中的数据才能真正插入新项。这是因为集合类上的Add方法返回一个值。这就是集合的实际工作方式。是的,可能是额外的懒惰只对索引集合(列表和映射)有效,但我不确定。我有点失望,因为我没有得到任何结论性的答案。
    assignment.Users.Remove(user)