2009-10-08 125 views
2

首先我明确表示,我没有使用任何OR映射器框架来解决这个问题,因为我需要从头开始理解模型。如何模拟这种关系?

好的。让我们来看看表的设计:

场 - 表

------------------ 
ID | CourseName 
------------------ 
1 | C++ 
2 | Java 
------------------ 

教师 - 表

----------------------- 
ID | TeacherName 
----------------------- 
1 | Professor X 
2 | Professor Y 
----------------------- 

CourseTeacher - 表

--------------------------------------------- 
ID | CourseID | TeacherID | ClassTime 
--------------------------------------------- 
1 | 1  |  1  | Monday 10:55 
2 | 1  |  2  | Thursday 10:55 
3 | 2  |  1  | Tuesday 11:45 
4 | 2  |  2  | Wednesday 11:45 
--------------------------------------------- 

我应该如何设计我的C#类?

可以有另一个问题像是:

用户 - 表

------------------ 
ID | UserName 
------------------ 
1 | a 
2 | b 
------------------ 

角色 - 表

----------------------- 
ID | RoleName 
----------------------- 
1 | c 
2 | d 
----------------------- 

的UserRole - 表

--------------------------------------------- 
ID | UserID | RoleID | Remarks 
--------------------------------------------- 
1 | 1  |  1  | xy 
2 | 1  |  2  | yz 
3 | 2  |  1  | zx 
4 | 2  |  2  | xx 
--------------------------------------------- 

回答

3

我thinkt你实际上有一个隐藏在那里的第三个概念:一个ClassSession或类似的东西。每个ClassSession都有一个Teacher,一个课程和一个DateTime。

public class ClassSession 
{ 
    public Teacher Teacher { get; set; } 

    public Course Course { get; set; } 

    public DateTime Time { get; set; } 
} 
+0

在我看来,这是正确的想法。这就是所谓的“物化”。 – duffymo 2010-12-28 18:00:10

+0

@duffymo,@Mark Seemann:虽然我认为这个答案对于@duffymo指出的理由有价值 - 提出了澄清绝对好的概念的好点 - 以更多地了解这个问题。但我认为它实际上并不能真正帮助@JMSA,因为他想将它建模为一个类,而上述目的实际上很可能在实际应用中没有任何价值 - 它可以是我的opionion FindClassSession中的一种搜索方法(老师,课程,时间)但绝对不是一堂课。我会说这正是在这种情况下不应该是一类的。只是我的意见 – user44298 2010-12-28 23:05:19

+0

@duffymo,@Mark cont'从上面:所以@JMSA将不得不写一个exctra类,除了他必须维护的教师和课程类,真的没用它。所以我认为它最终是这样的:更多的代码给mainain(实际上可能不是有用的),因为@JMSA容易犯更多的错误(只是因为现在有更多的代码需要担心。有价值的结晶课堂会议的想法,但不能超越,因为目的似乎没有足够的实际应用。 – user44298 2010-12-28 23:10:24

3

一般情况下,当你有一个多到许多在你的领域模型的关系,在你的代码的访问模式,要么是从M2M的或从另一面......

例如如果你有一个包含人的结构,每个人都在你的零售店进行了大量的采购,你可能通常希望访问这些交易,而不是通过产品。换句话说,你可能更想知道某个特定的人购买了哪些产品,而不知道人们购买了哪种产品。所以在这个例子中,您只需让每个人类都包含一个属性,这是一个产品集合。没有必要通过Product类访问Person类。

另一个例如如果你有一个包含人的结构,每个人都会订阅一些杂志。

现在,如果您是出版商,您可能通常希望通过杂志访问这些交易,而不是通过该人。换句话说,你会更多地想知道人们订阅特定杂志的内容,而不是特定人员订阅的杂志。所以在这个例子中,你会在Magazine类中放置一个Subscribers集合属性。

1

我的示例:

interface ICourse 
{ 
    string Name { get; set; } 
} 

interface ITeacher 
{ 
    string Name { get; set; } 
} 

interface IClassSession 
{ 
    ICourse Course { get; set; } 
    ITeacher Teacher { get; set; } 
    DateTime Scheduled { get; set; } 
} 

interface ITransactionalEntity 
{ 
    int ID { get; set; } 
} 

//sample class implementation 
class Teacher : ITeacher, ITransactionalEntity 
{ 
    private int _ID; 
    public int ID 
    { 
     get { return _ID; } 
     set { _ID = value; } 
    } 
    //implement interfaces 
    public void Save(SqlTransaction tran) 
    { 
     if (this.ID > 0) 
      //insert 
     else 
      //update 
    } 
} 

class ClassSession : IClassSession, ITransactionalEntity 
{ 
    //implement interfaces 
    public void Save(SqlTransaction tran) 
    { 
     this.Course.Save(tran); 
     this.Teacher.Save(tran); 
     if (this.ID > 0) 
      //insert 
     else 
      //update 
    } 
} 

... 
List<IClassSession> list = new List<IClassSession>(); 
ClassSession cs = new ClassSession(); 
cs.Course = new Course(courseID); 
cs.Teacher = new Teacher(teacherID); 
classlist.Add(cs); 
SqlTransaction tran; 
... 
foreach(IClassSession classsession in list) 
    classsession.Save(tran); 
... 

,你可以做任何你想要的,它的Linq等发挥你的想象力。并非所有东西都写在这里,就像一个想法。

+0

“if(this.ID> 0)”是否应该用于更新查询,否则该ID是从记录插入时的数据库自动增量中分配的? – 2012-05-21 07:14:26

0

如果你已经习惯了亲子关系,那么我建议你尝试将它们建模为两个独立的父子关系。例如,有一个屏幕可以编辑教师并允许他们添加现有课程。另一方面,你可以有一个课程屏幕,允许他们添加现有的treachers。遵循这个建议应该让你的工作更轻松。从一个类的设计中,你可以用同样的方式对它进行建模。课程课程将有一种方法将教师添加到教师的内部列表中。教师课程还可以将课程添加到内部课程列表中。这些类的物理结构实际上取决于你计划如何保持对象。基于文件的持久性,xml序列化和数据库持久性可以具有不同的内部对象结构。如果您是从实体级别或业务层级进行建模,那么也存在阶级差异。无论如何,希望我已经给你足够的想法来运行它。