2013-12-16 243 views
1

我需要帮助的设计问题。最好用一个例子来描述。 使用下面的域模型: - 学生 - 报名 - 课程查看模型设计的领域模型多对多关系

如果学生和课程有一个多对多的关系彼此,由报名表实现的,即招生有StudentID(FK)和CourseID (FK)。 学生和课程都有导航属性,即另一个导航属性。

我使用查看模型,并希望简单的CRUD功能,添加,编辑,删除学生和课程。 View模型与其相关的Domain模型非常相似。

要显示学生的详细信息很简单,但是当显示学生的课程信息时,哪种下面的设计会是最好的方法?

  1. 在Student View模型中,声明注册域模型的ICollection? 然后在视图中可以访问注册详细信息。 我觉得好像这样就解除了View模型试图实现的功能,那就是从领域模型中提取一个抽象层。使用这种设计,可以通过学生视图模型从视图访问注册域模型。

  2. 为Enrollment类创建View模型。 这将与其域模型相同。除View Model中的域模型的值之外,不会执行其他任何操作。必须通过AutoMapper进行映射。不知道该怎么做,感觉效率低下。

回答

2

首先,Enrollment不应该是域模型。 Enrollment只是一个数据库表,它指定从Student s到Course s之间的多对多关系。

我的建议是在Student域模型创建CourseList一个S,并使用NHibernateFluent NHibernate映射StudentCourse,然后创建映射一个多一对多的关系,你可以简单地检索来自Student实例的Course

另外,使用映射代替在代码中写入某些SQL语句时,可以更自由地使用级联操作。

+0

是的,很好,谢谢。我明白了为什么我不需要注册视图模型。另外,我正在使用实体框架,现在已经正确地阅读了导航属性和Fluent API。我了解如何创建外键关联(通过类中的FK)和独立关联(通过导航属性)。 –

+0

@ThomasVeil如果是这种情况,我会将'Enrollment'表映射到一个Domain Model中。请检查[此答案](http://stackoverflow.com/a/5543702/1831275)以查看如何在EF中执行映射 – albusshin