将数据从数据库加载到以下结构的最佳方法是什么

本文关键字:结构 最佳 方法 是什么 数据 数据库 加载 | 更新日期: 2023-09-27 18:30:47

数据库模式如下

员工

  • 员工 ID(int, pk)
  • 名字(nvarchar)
  • 姓氏(nvarchar)
  • 电子邮件(nvarchar)
  • 员工类型(整数)
  • 薪资(十进制)
  • 小时费率(十进制)

好处

  • 福利 ID (整数, 包)
  • 福利(nvarchar)
  • EmployeeID (int, fk)
员工

表保存所有员工数据。工资字段适用于全职员工,小时费率适用于小时工。福利仅适用于全职员工。

我已经设置了一个服务类,将返回所有员工。我还想初始化受薪员工对象的所有福利。我已经使用 switch 语句设置了对员工类型的检查,然后创建对象的实例并将其添加到集合中。

这将完美地工作。

遇到的问题是每次我添加新类型的员工时,我都必须修改员工服务并添加逻辑来切换语句以处理新类型的员工。这打破了开合原则。

我的问题是,在这种情况下,

将数据从数据库加载到对象的最佳方法是什么?

public enum EmployeeType
{
    FullTime =1,
    PartTime =2
}
public class EmployeeBenefit
{
    private string _benefit;
    private Employee _employee;
    public int EmployeeId { get { return Employee.Id; } }
    public Employee Employee { get { return _employee; } }
    public string Benefit { get { return _benefit; } }
    public EmployeeBenefit(Employee emp, string benefit)
    {
        _benefit = benefit;
        _employee = emp;
    }
}
public abstract class Employee
{
    public int Id { get; set; }
    public abstract EmployeeType Type { get; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}
public class SalariedEmployee: Employee
{
    private ICollection<EmployeeBenefit> _benefits;
    public SalariedEmployee()
    {
        _benefits = new List<EmployeeBenefit>();
    }
    public IEnumerable<EmployeeBenefit> Benefits { get {return _benefits;} }
    public double Salary { get; set; }
    public override EmployeeType Type
    {
        get { return EmployeeType.FullTime; }
    }
    public void AddBenefit(string benefit)
    {
        EmployeeBenefit ebenefit = new EmployeeBenefit(this, benefit);
        if (Benefits.Contains(ebenefit))
            _benefits.Add(ebenefit);
    }
    public void RemoveBenefit(string benefit)
    {
        EmployeeBenefit ebenefit = new EmployeeBenefit(this, benefit);
        if(_benefits.Contains(ebenefit))
            _benefits.Remove(ebenefit);
    }
}
public class PartTimeEmployee : Employee
{
    public override EmployeeType Type
    {
        get { return EmployeeType.PartTime; }
    }
    public double HourlyRate { get; set; }
}
public class EmployeeService
{
    public IEnumerable<Employee> GetAll() {         
        List<Employee> _lst = new List<Employee>();
        using(var db = new EmployeeContext)
        {
            foreach(Employee e in db.Employees)
            {
                switch(e.Type){
                    case EmployeeType.PartTime:
                        PartTimeEmployee pt = new PartTimeEmployee();
                        //initialize the values of parttime employee like hourly rate
                        _lst.Add(pt);
                        break;
                    case EmployeeType.FullTime:
                        SalariedEmployee se = new SalariedEmployee();
                        //initialize the value of salaried employees like benefits, salary
                        _lst.Add(se);
                        break;
                }
            }

        }
        return _lst;
    }
}

将数据从数据库加载到以下结构的最佳方法是什么

您可以做的是简单地将雇员类型保留为 雇员类中的字符串属性,并将类型动态添加到雇员类中。我在这里没有看到员工类型类的实际需求。

如果你绝对需要这样的类,请将其声明为类而不是枚举,并有一个字符串属性,该属性将是类型的名称。之后,对于从查询中获得的每个新类型,初始化一个new EmployeeType()并使用 setter 添加该字符串。然后将该 EmployeeType 设置为 Employee 类。

根据我的说法,这是一个更好的设计,因为您不需要对枚举中的字符串值进行硬编码。

对于福利的事情,你可以做的是有一个具体的 Employee 类的福利属性(或者命名它,因为你已经有一个抽象的 Employee)。并且仅当员工类型受薪时,才为福利设置值。这就是我会这样做的。