我有两个实体用户和课程。用户可以参加几个课程,使这种关系成为一对多。但是,许多学生可以选修一门课程,因此可以建立多对多的关系。
现在,我需要为用户注册课程。我的用户实体有:
public void AddCourse(Course course)
{
if (CoursesAlreadyAdded(course))
{
AddBrokenRule(new BrokenRule() { PropertyName = course.ClassCode, Message = String.Format("Course with classCode = {0} already added", course.ClassCode) });
return;
}
UserCourses.Add(new UserCourse() { UserId = this.UserId, CourseId = course.CourseId, Course= course, User = this});
}
这些类是通过Linq to SQL生成的。 Linq to sql无法执行多对多的关系,所以我必须自己处理它。
现在,问题是如何将信息发送到数据库。 UserRepository.Save(用户)是否应负责保存课程。
这种意味着User是Course实体的聚合根,但实际上并不是因为我可以通过很多不同的方式访问Course而且我不依赖于User对象来提供课程。
即使我有一个CourseRegistrationService(我有),我必须调用一个存储库来保存更改。哪个存储库负责持久保存有关用户和课程关系的更改。也许是UserCourseRepository !!
另外,只需在User对象下放置一个List就可以使User成为聚合根或者是不正确的。如果是这样,那么如何使用OR MAPPERS设计应用程序,它自动生成List和一对多关系。
答案 0 :(得分:4)
在DDD术语中,您应该考虑聚合和聚合根。用户“拥有”课程吗?可能不是。
相反,想到这样可能会给你一个更好的设计:
用户有很多注册。 注册与1门课程相关。
现在你没有多少人。您有一个用户实体“拥有”的第一类对象。
注册将是一个值对象(具有UserID,CourseID,可能还有DateAdded)。
关于使用方法添加到集合的两边,这也是我对NHibernate所做的事情。
答案 1 :(得分:0)
我遇到了类似的解决方案,但采用了完全不同的方法。我在LINQ to SQL类中添加了代码,以便它们正确支持多对多关系。查看此博客文章了解最终详细信息:
Mitsu's blog: How to implement a many-to-many relationship using LINQ to SQL
至于哪个存储库应该处理将学生添加到 Class 课程,您的服务名称应该给你一个提示(CourseRegistrationService
)。课程库应该是将学生添加到课程中。