我将所有字段设置为可空类型,其中它们对应的后端数据库字段允许空值.好?坏?
长版:
它工作得很好,我只是觉得我可能会滥用我可以使东西可以为空的事实.
基本上,它是一个与我们的SQL数据库相关联的员工管理的内部应用程序.我使用的是三层结构,从演示到后端:Business Objects – >业务逻辑 – >数据访问.
对于我的Employee对象,我有以下字段:
public class Employee : Person
{
private EmployeeTitle? _employeeTitle = null; //enum
private EmployeeType _employeeType; //enum
private DateTime _startDate;
private DateTime? _endDate = null;
private EmployeeInsuranceRecord _employeeInsuranceRecord = new EmployeeInsuranceRecord();
//...
}
public class EmployeeInsuranceRecord
{
private int? _employeeInsuranceRecordID = null;
private string _alienRegistrationNumber = null;
private string _healthInsuranceNumber = null;
private string _unemploymentInsuranceNumber = null;
private string _welfarePensionNumber = null;
private DateTime? _insuranceAcquiredDate = null;
//...
}
在我的数据库中:
> EmployeeTitleID允许空值.例如,员工可以在试用期内开始,没有固定的职位.
> EmployeeTypeID不允许空值.即使员工是客人或试用期,也必须明确选择这一点以用于记录目的.
> StartDate不允许空值.如果有人进入数据库,我们需要知道他们何时开始.
>然而,EndDate确实允许空值.目前受雇的任何人还没有EndDate.
>我在Employee实例化上实例化一个EmployeeInsuranceRecord对象,但EmployeeInsuranceRecord中的每个字段都可以为空,因为EmployeeInsuranceRecords进入一个通过ID链接的单独表,因此Employee可以在没有EmployeeInsuranceRecord的情况下存在(对于刚刚开始的人来说,仍然在最初的文书工作中很常见)处理).通过从一开始就实例化EmployeeInsuranceRecord,我可以通过不在那里实例化任何类来保持我的表示层更清晰.考虑到我们正在进行的小规模,这对性能没有影响.
解决方法:
null的一个烦恼是在取消引用/消耗值之前继续检查null的编码开销 – 您可能需要使用一堆静态扩展方法来使您的生活更轻松.
但是使用null比使用像DateTime.MinValue这样的“魔术值”更好 – 这不仅会破坏数据,而且如果您忘记将其映射回null,则在持久保存到数据库时可能会出现问题.
如您所述,某些值成为强制性的,因为它们是“状态”依赖的(例如,当员工辞职/退休/被解雇时需要EndDate).您需要根据此分割出验证策略.