我们有以下数据模型:
CalendarAppointment 1 <------> * AppointmentRole * <--------> 1 Person (or Group)
一个日历约会可以有多个人与其关联。每个人都可以扮演不同的角色(参加、驾驶、接送)。(一个人也可以是一个组的成员,组也可以与约会相关联,但这对于这个问题来说是额外的学分)。
在呈现日历的Web请求开始时,我们希望在给定的日期范围内拉入与登录成员相关的所有约会。
“驾驶”桌是日历预约。呈现方式如下:
foreach (var appointment in dataContext.Appointments.Where(person has appointment role)]
{
... render appointment ...
foreach (role)
... render role...
目前,这是通过linq-to-sql对一个我们在SQL Server中定义的视图进行查询来完成的,这个视图将连接来自calendarepointment、appointmentrole和person的列。这是进行查询的最佳方法,但是一旦数据位于对象世界中,就可以更方便地处理映射到构成视图的组成表的对象。
所以在对象世界里,我想处理…
class CalendarAppointment
{
IEnumerable<AppointmentRole> Roles ...
...
class AppointmentRole
{
Person Person ...
我们也遇到了与单元测试相关的问题。通过填充离散表,然后对视图进行查询来设置场景要容易得多。内存中的数据表示不会为我们这样做,所以我们最终填充视图的内存中表示。
所以我们要做的是对视图进行查询,然后将结果分解为反映底层表的对象结构。唯一的方法似乎是对表进行单独的查询:
-
查询约会角色表
-
使用第一个查询中的约会外键集查询日历约会。
-
使用第一个查询中的Person外键集查询Person表。
这似乎相当复杂。这似乎是ORM世界中的一个常见问题。是否有人对1)如何对视图执行查询并让它填充另一侧的表对象,或2)解决问题的不同模式或方法有任何见解?