如何建立这种关系?

时间:2009-10-08 09:15:03

标签: c# many-to-many

首先,我明确表示,我没有使用任何OR Mapper框架来解决这个问题,因为我需要从头开始理解模型。

行。我们来看看表格设计:

课程 - 表格

------------------
 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
---------------------------------------------

4 个答案:

答案 0 :(得分:3)

我认为你实际上有一个隐藏的第三个概念:ClassSession,或类似的东西。每个ClassSession都有一个Teacher,一个Course和一个DateTime。

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

    public Course Course { get; set; }

    public DateTime Time { get; set; }
}

答案 1 :(得分:3)

通常,当您的域模型中存在多对多关系时,代码中的访问模式将来自M2M的一侧或来自另一侧......

例如如果您拥有一个包含人员的结构,每个人都在您的零售店进行了大量购买,那么您通常希望通过该产品访问这些交易,而不是通过该产品。换句话说,您可能更经常想知道特定人员购买的产品,而不是人们购买特定产品的产品。因此,在此示例中,您只需让每个人类都包含一个属性,该属性是一组产品。不需要通过Product类访问person类。

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

现在,如果您是出版商,您通常可以通过杂志而不是通过该人访问这些交易。换句话说,你会更常想知道人们订阅特定杂志的内容,而不是特定人士所订阅的杂志。因此,在此示例中,您将在Subs类中放置Subscribers集合属性。

答案 2 :(得分: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它等等。运用你的想象力。并非所有内容都写在这里,只是作为一个想法。

答案 3 :(得分:0)

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