1

我在分配和用户之间有一个多对多的关系

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

我该如何避免呢?

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 进行分配映射,但是在更新它时,它正在删除然后重新插入 AssignmentsToUsers 表中的很多行。所以我改用Set。

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

推荐的方法是什么?

4

2 回答 2

1

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

  1. 如果集合的另一端(User.Assignments)重量较轻,则改为从用户那里删除分配。
  2. 对多对多表建模,直接删除对象。您必须确定不会在此之前加载用户集合,因为内存中的表示仍将包含已删除的记录。
  3. 使用 SQL 直接删除 - 这与 #2 有相同的警告。
于 2012-12-13T18:05:41.263 回答
0

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

于 2012-12-13T09:53:22.877 回答