我在用户和调查之间有多对多关系,这种关系是双向的,所以在为 列表添加新调查时users
,我需要这样做:
foreach(User user in users)
{
survey.Users.Add(user);
user.Survey.Add(survey);
}
遍历所有用户对我来说似乎有点矫枉过正,因为可能有很多用户。
没有更好的方法吗?是否有可能有一个单向的多对多?
我在用户和调查之间有多对多关系,这种关系是双向的,所以在为 列表添加新调查时users
,我需要这样做:
foreach(User user in users)
{
survey.Users.Add(user);
user.Survey.Add(survey);
}
遍历所有用户对我来说似乎有点矫枉过正,因为可能有很多用户。
没有更好的方法吗?是否有可能有一个单向的多对多?
啊,你的问题是你的数据库设计。如果不分解,多对多关系会导致您非常头疼:)。
解决方案:创建一个名为 的新表UserSurvey
,其中包含一个主键,然后是一个UserID
字段和一个SurveyID
字段,如下所示:
----------------------------------------
| UserSurveyID | PrimaryKey |
| UserID | Foreign Key to User |
| SurveyID | Foreign key to Survey |
----------------------------------------
然后您需要做的就是查询该表以获取您需要的内容。
我还要做的可能是在 nHibernateUserSurvey
类中,放置实际User
属性和Survey
属性,以便在您拥有UserSurvey
对象后为您节省额外的查询。
是的,你可以有一个单向的多对多。你不需要做任何特别的事情来实现这一点,只是不要映射关系的另一端。
如果您需要维护关系的内存表示,那么您需要在执行过程中添加对关系双方的引用。这并不过分,您必须将一组用户与调查相关联,因此在某些时候您必须遍历一组用户并进行关联。
如果要避免加载调查的用户集合,可以在访问之前检查集合是否已初始化:
foreach(User user in users)
{
user.Survey.Add(survey);
if (NHibernateUtil.IsInitialized(survey.Users)
{
survey.Users.Add(user);
}
}