1

多対多の関係を必要とする User クラスと Role クラスがあります。ユーザーがコレクションまたはロールを持っている場合、またはその逆の場合、流暢な API でマッピングを指定する方法を理解できます (例: ロール マッピング)。

    this.HasMany(t => t.Users)
        .WithMany(t => t.Roles)
        .Map(m =>
            {
                m.ToTable("UsersToRoles");
                m.MapLeftKey("RoleId");
                m.MapRightKey("UserId");
            });

ただし、ユーザー (クラス) にロールのコレクションを持たせたいのですが、通常、各ロールには非常に多くのユーザーが存在する可能性があるため、ロール (クラス) にユーザーのコレクションを持たせたくありません。 Role インスタンスにアクセスすると、それらのすべてのユーザーが読み込まれる可能性があるというリスクは避けたいと思います。2つの質問:

  1. 私が心配するのは正しいですか?(.edmx の初期の頃に記憶の問題があり、削除されるまで、偽の双方向関係が大きなパフォーマンスの問題を引き起こしていました)?

  2. もしそうなら、両方のクラスにコレクションがない場合、どうすれば多対多の関係を指定できますか?

ありがとう

4

1 に答える 1

4

私が心配するのは正しいですか?(.edmx の初期の頃に記憶の問題があり、削除されるまで、偽の双方向関係が大きなパフォーマンスの問題を引き起こしていました)?

遅延読み込みを許可すると、リスクが生じる可能性があります。virtualコレクションから修飾子を削除しRole.Usersて、このコレクションが遅延ロードされないようにすることができますInclude(r => r.Users)。たとえば、明示的な要求があった場合のみです。EF 4.0 で意味する「偽の双方向の関係」は、おそらく、自動生成された関係修正コードを含む POCO を使用していた可能性があり、実際には望ましくない副作用を引き起こすことがありました (ただし、主に遅延読み込みが原因でした)。

もしそうなら、両方のクラスにコレクションがない場合、どうすれば多対多の関係を指定できますか?

User側から多対多の関係を構成し、WithMany()ラムダ パラメータなしで使用する必要があります。

this.HasMany(t => t.Roles)
    .WithMany()
    .Map(m =>
        {
            m.ToTable("UsersToRoles");
            m.MapLeftKey("UserId");
            m.MapRightKey("RoleId");
        });

thisEntityTypeConfiguration<User>この場合はです。マッピングの「左」と「右」が逆になっていることにも注意してください。

于 2013-09-05T20:09:15.383 に答える