删除集合而不加载所有集合数据。混淆了哪个集合映射使用

时间:2012-12-13 00:48:32

标签: nhibernate fluent-nhibernate

我在Assignment和User

之间有多对多的关系

当尝试从作业中删除用户时,我看到所有用户都已加载到该集合中。

如何避免这种情况?

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; }
}

映射:

HasManyToMany(user => user.Assignments).Table("UserToAssignment").ParentKeyColumn("UserId").ChildKeyColumn("AssignmentId").Inverse().ExtraLazyLoad();  

HasManyToMany(productAssignment => productAssignment.Users).AsSet().Table("UserToAssignment").ParentKeyColumn("AssignmentId").ChildKeyColumn("UserId").LazyLoad(); 

致电代码:

assignment.Users.Remove(user)

最初我使用Bag代替Set for Assignment映射,但是在更新它时,它正在删除然后在AssignmentsToUsers表中重新插入很多行。所以我改用了Set。

但现在我发现使用Set有问题:它将所有数据都带入内存。

建议的方法是什么?

2 个答案:

答案 0 :(得分:1)

你无法避免这种情况,如果性能可以接受,我会忽略它。如果性能有问题,我可以通过三种方式来解决它:

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

答案 1 :(得分:0)

你也应该为Assignment.Users使用额外的延迟模式。