首先,我明确表示,我没有使用任何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
---------------------------------------------
答案 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序列化和数据库持久性可以具有不同的内部对象结构。如果从实体级别或业务层级别进行建模,则还存在类别差异。无论如何,希望我已经给你足够的想法与它一起运行。