1

User と Survey の間に多対多の関係があり、その関係は双方向であるため、 のリストに新しい調査を追加するときは、次のようusersにする必要があります。

foreach(User user in users)
{
    survey.Users.Add(user);
    user.Survey.Add(survey);
}

多くのユーザーが存在する可能性があるため、すべてのユーザーを反復処理するのはやり過ぎに見えます。

より良い方法はありませんか?単方向の多対多を持つことは可能ですか?

4

2 に答える 2

1

ああ、あなたの問題はデータベースの設計です。多対多の関係は、分解されていない場合、このような大きな頭痛の種になります:)。

解決策:UserSurvey次のように、主キー、UserIDフィールド、フィールドを使用して、という名前の新しいテーブルを作成しますSurveyID

----------------------------------------
| UserSurveyID | PrimaryKey            |
| UserID       | Foreign Key to User   |
| SurveyID     | Foreign key to Survey |
----------------------------------------

あとは、そのテーブルに必要なものをクエリするだけです。

また、オブジェクトを取得したら、nHibernateUserSurveyクラスに実際のUserプロパティとSurveyプロパティを配置して、追加のクエリを節約することもできますUserSurvey

于 2013-01-21T12:02:48.420 に答える
0

はい、一方向の多対多を使用できます。これを達成するために特別なことは何も必要ありません。関係の反対側をマッピングしないでください。

リレーションシップのメモリ内表現を維持する必要がある場合は、リレーションシップの両側に参照を追加する必要があります。これはやり過ぎではありません。一連のユーザーを調査に関連付ける必要があるため、ある時点で一連のユーザーをループしてその関連付けを行う必要があります。

調査のユーザー コレクションの読み込みを回避したい場合は、アクセスする前にコレクションが初期化されているかどうかを確認できます。

foreach(User user in users)
{
    user.Survey.Add(survey);
    if (NHibernateUtil.IsInitialized(survey.Users)
    {
        survey.Users.Add(user);
    }
}
于 2013-01-21T19:08:37.263 に答える