Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 面向对象设计的数据库模型?_C#_Sql_Database_Class Design - Fatal编程技术网

C# 面向对象设计的数据库模型?

C# 面向对象设计的数据库模型?,c#,sql,database,class-design,C#,Sql,Database,Class Design,我该如何设计类,用c#表示数据库模型 给定数据库的以下表和字段 表格:员工 Pk EmpID Lname Fname Adress Fk DeptID 表格:部门 Pk DeptID DeptName Location 好的,现在我想用C#做两个班,一个给员工,一个给部门。我挂断的部分是外键。我应该在设计对象时使用外键,还是应该在部门的Employee类中放置一个引用,还是应该在Department类中放置一个Employee引用列表,还是应该同时执行这两项操作

我该如何设计类,用c#表示数据库模型

给定数据库的以下表和字段

表格:员工

Pk EmpID
   Lname
   Fname
   Adress
Fk DeptID
表格:部门

Pk DeptID
   DeptName
   Location

好的,现在我想用C#做两个班,一个给员工,一个给部门。我挂断的部分是外键。我应该在设计对象时使用外键,还是应该在部门的Employee类中放置一个引用,还是应该在Department类中放置一个Employee引用列表,还是应该同时执行这两项操作?我知道如果我使用外键,效率会降低,因为我必须搜索与外键匹配的主键列表,但我可能应该在设计中包含它们

不要在对象中使用“外键”。使用参考文献;每个部门都应该有一份员工名单。根据您是否需要将员工的引用回溯到其部门,确定员工是否将引用到部门。

首先,如果可能,我建议使用NHibernate、实体框架或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; }
}
class Employee {

    public int[] DepartmentIds { get; set; }
    public List<Department> Departments {
        get {
            return YourStaticReference.DepartmentList
                .Where(x => this.DepartmentIds.Contains(x.DepartmentId));
        }
    }
}
公共类员工
{
公共int Id{get;set;}
公共字符串LastName{get;set;}
公共字符串名{get;set;}
公共广播地址{get;set;}
公共部门部门{get;set;}
}
公共课系
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共广播位置{get;set;}
公共ICollection雇员{get;set;}
}

我不想过于简化,但如果您拥有Employee=>Department或Department=>Employee的导航属性,则Employee会根据您的应用程序的需要而非常具体

然而,根据经验,我倾向于将导航属性从继承权的顶部向下放置。这意味着我会有部门。员工,但不是员工。部门

同样,这是特定于您的,但是您似乎不太可能需要从每个员工那里获取部门对象。因此,在Employee类中使用键进行查找,如下所示:

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; }
}
class Employee {

    public int[] DepartmentIds { get; set; }
    public List<Department> Departments {
        get {
            return YourStaticReference.DepartmentList
                .Where(x => this.DepartmentIds.Contains(x.DepartmentId));
        }
    }
}
class员工{
public int[]部门ID{get;set;}
公开名单部门{
得到{
返回您的StaticReference.DepartmentList
其中(x=>this.DepartmentId.Contains(x.DepartmentId));
}
}
}

看到了吗?祝你好运

关于@Paul Sonier答案的详细阐述

另外,我使用的是一般意义上的业务层、业务类,而不是某些特定技术设计模式的行话

使用数据库键的具体问题
使用数据库键将导致编码开销的爆炸,以保持对象和数据库同步。当需要添加、更改、删除对象时(通过用户GUI),你会像疯了一样跳出圈套。当数据库中还不存在父对象时,如何创建子对象?想象一下,尝试使用任何N级数据结构来实现这一点。

始终设计业务类而不考虑数据存储
业务层类应该忠实地反映业务规则、术语、概念和上下文。从长远来看,用非商业的东西来污染这个“创意空间”,这些东西包含存储或显示数据的细节是不好的。现在听我说,以后相信我

基于某些特定数据库表布局(及其键等)的业务类将使编写代码以验证规则、创建这些对象的正确状态等变得非常困难。这是保持对象ID与数据库同步的首要问题。

最大限度地实现业务层和数据层的解耦
你问题中的例子是一个诱人的骗局。您的一些业务类可能与您的数据库设计非常匹配。因此,主键和外键似乎也适合

但是在任何非平凡的应用程序中,数据库模型都会出现偏差。如果现在不行,以后再说。它将偏离数据库完整性、效率和速度的目标。这与商业模式有什么关系?没有什么。

表明你做得对的指标

Pk DeptID
   DeptName
   Location
  • 您可以在没有现有数据库的情况下实例化业务对象

  • 每个对象都可以引用它的“子对象”,而不需要在业务类模型之外创建特殊的键

  • 每个业务对象都可以自己验证、强制执行、标记等等。它自己的所有规则,甚至像“不能为空”这样的琐碎规则。复合类/对象的业务规则验证是类设计和分析活动,而不是数据库设计活动


  • 数据绑定时,在内存占用和引用方面,您的设计存在很多问题。循环引用问题将使@SupermansTshirt的工作变得更加困难。顺便说一句,如果你有一个SL或WPF应用程序,而不是List use ObservableCollection,那么没有什么能阻止你在你的系课上使用相同的技术。如果您通过服务发送此信息,请注意可能错误创建的大小。