1

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)

最初は割り当てマッピングに Set ではなく Bag を使用していましたが、更新時に AssignmentsToUsers テーブルの多くの行を削除してから再挿入していました。そこで、セットを使うことにしました。

しかし、Set を使用すると問題が発生します。すべてのデータがメモリに取り込まれます。

これを行うための推奨される方法は何ですか?

4

2 に答える 2

1

これは避けられないので、パフォーマンスが許容範囲内であれば無視します。パフォーマンスが問題になる場合、それに取り組むために私が考えることができる3つの方法があります。

  1. コレクションの反対側(User.Assignments)が軽量の場合は、代わりにユーザーから割り当てを削除します。
  2. 多対多のテーブルをモデル化し、オブジェクトを直接削除します。メモリ内の表現には削除されたレコードがまだ含まれているため、これより前にUsersコレクションがロードされないことを確認する必要があります。
  3. SQLを使用した直接削除-これには、#2と同じ注意事項があります。
于 2012-12-13T18:05:41.263 に答える
0

Assignment.Usersにも追加のレイジーモードを使用する必要があります。

于 2012-12-13T09:53:22.877 に答える