我如何设计c#中的类来表示数据库模型?
给出数据库的以下表格和字段,
表:员工
Pk EmpID
Lname
Fname
Adress
Fk DeptID
表:部门
Pk DeptID
DeptName
Location
好的,现在我想在C#中创建2个类,一个用于Employee,一个用于Department。我挂掉的部分是外键。我应该在设计中使用外键作为对象,还是应该在部门的Employee类中添加引用,还是应该在我的Department类中列出员工引用列表,还是应该同时执行这两项操作?我知道如果我使用外键,效率会降低,因为我必须搜索与外键匹配的主键列表,但我可能应该将它们包含在设计中。
答案 0 :(得分:3)
请勿在对象中使用“外键”。使用参考;每个部门都应该有一份员工清单。根据您是否需要从员工反向引用其部门,确定员工是否会引用部门。
答案 1 :(得分:3)
关于@Paul Sonier的详细解答......
P.S。我在一般意义上使用业务层,业务类,而不是某些特定技术设计模式的行话。
使用数据库密钥的具体问题
使用数据库密钥将导致编码开销的爆炸,以保持对象和数据库同步。由于需要添加,更改,删除对象(通过用户GUI),您将疯狂地跳过篮球。当父对象在数据库中尚不存在时,您将如何创建子对象?想象一下,尝试使用任何N级数据结构。
始终设计业务类而不考虑数据存储
业务层类应忠实地反映业务规则,术语,概念和上下文。从长远来看,用非商业资料对这个“想法空间”进行污染,其中包含有关存储或显示数据的详细信息。现在听我说,以后相信我。
基于某些特定数据库表布局(以及它的键等)的业务类将使编写用于验证规则的代码,创建这些对象的正确状态等等变得极其困难。这是保持对象ID与数据库同步的问题。
最大化业务层和数据层的解耦
您的问题中显示的示例是诱人的欺骗。您的某些业务类可能非常适合您的数据库设计。因此,主键和外键似乎也适合。
但是 在任何非平凡的应用程序中,数据库模型将偏离。如果不是现在,稍后。它将偏离数据库完整性,效率和速度的目的。这与商业模式有什么关系?没有。
您做得对的指标
您可以在没有现有数据库的情况下实例化业务对象
每个对象都可以引用它的“子”,而不需要在业务类模型之外创建特殊键。
每个业务对象自己可以验证,强制执行,标记等所有它自己的规则,甚至像“不能”这样的微不足道的规则空白”。复合类/对象的业务规则验证是类设计&分析活动 - 而不是数据库设计活动。
答案 2 :(得分:0)
首先,如果可能的话,我建议使用像NHibernate,Entity Framework或Linq to SQL这样的工具来为你做关系映射的对象。但是,如果你不想这样做,我可能会设计我的对象模型:
public class Employee
{
public int Id { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public Address Address { get; set; }
public Department Department { get; set; }
}
public class Department
{
public int Id { get; set; }
public string Name { get; set; }
public Address Location { get; set; }
public ICollection<Employee> Employees { get; set; }
}
答案 3 :(得分:0)
我不想过度简化,但如果你有来自Employee的导航属性=&gt;部门或部门=&gt;员工非常专注于您的应用程序的需求。
然而,根据经验,我倾向于从层次结构的顶部放置导航属性。这意味着我会有Department.Employees而不是Employee.Departments。
同样,这是特定于您的,但您似乎不太可能需要从每个Employee获取Department对象。因此,使用Employee类中的键进行查找,如下所示:
class Employee {
public int[] DepartmentIds { get; set; }
public List<Department> Departments {
get {
return YourStaticReference.DepartmentList
.Where(x => this.DepartmentIds.Contains(x.DepartmentId));
}
}
}
请参阅?祝你好运!