1

我在用户和调查之间有多对多关系,这种关系是双向的,所以在为 列表添加新调查时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 回答