我担心这可能会因为基于意见而被关闭但是......
我有一个实体
namespace Rota.Domain.Entities
{
public class Shift
{
[Key]
public int ShiftID { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
public string StartTime { get; set; }
public string EndTime { get; set; }
public TimeSpan ShiftLength {
get
{
return DateTime.Parse(EndTime).Subtract(DateTime.Parse(StartTime));
}
}
public virtual ICollection<EmployeeShift> EmployeeShifts { get; set; }
}
}
我想知道的是,将一些字段故意留空是否完全可以,例如,如果启动时间/结束时间不适用,例如如果这个人正在度假,这不需要开始或结束时间。
目前我的initaliser文件如下所示:
protected override void Seed(EFDbContext context)
{
List<Shift> shifts = new List<Shift>()
{
new Shift { Name = "Early", StartTime = "08:00", EndTime = "16:00" },
new Shift { Name = "Normal", StartTime = "9:00", EndTime = "17:00" },
new Shift { Name = "Late", StartTime = "10:00", EndTime = "18:00" },
new Shift { Name = "Holiday" },
new Shift { Name = "Sick" }
};
shifts.ForEach(s => context.Shift.Add(s));
context.SaveChanges();
}
只是觉得这些空白是不对的,但我也不知道我会做什么/做什么不同。
在实体属性不适用时将它们留空是否可以
答案 0 :(得分:0)
您可能希望使用TimeSpan而不是字符串,因为您可以使用时间跨度更轻松地进行计算,如果您不想为它们设置值,它们可以为空。但一般情况下,Holiday或Sickleave应该是一个&#34;完整日期&#34;活动,所以可能是从00:00到24:00。这有点取决于你想要如何建模数据以及你将如何处理它们。
要回答这个问题,是的,只要您在意图上执行此操作,就可以为实体设置空值,并在使用实体时处理它们。例如,对于某些用户设置(允许通过电子邮件联系等),你可以拥有一个可以为空的布尔字段,将其设置为null将意味着没有从用户那里询问并且应该处理为&#34; no&#34;,具有值将是表示用户实际已保存设置,值应按原样使用。
答案 1 :(得分:0)
名称和数据类型应该清楚地向其他开发者传达您的意图。 Nullable值非常适用于此目的,因为它们不仅表示底层字段可能为null,而且它们还会破坏类型兼容性,除非您显式访问可为空的Value
属性。它迫使开发人员考虑如何处理空值。
考虑到这一点,我建议您更改StartTime和EndTime:
public DateTime? StartTime { get; set; }
public DateTime? EndTime { get; set; }
如果可能,请避免使用字符串来表示数据,如果有更窄的原子数据类型以满足您的需求。当另一个开发人员看到一个字符串时,他立即需要知道几件不明显的事情:
上述所有内容都可以通过文档或数据属性明确传达......但即使您使用DateTime?
,它仍然只是更简单不需要日期部分。