当实体框架实体属性不适用时,将它们留空

时间:2015-07-22 16:00:27

标签: c# entity-framework

我担心这可能会因为基于意见而被关闭但是......

我有一个实体

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();
         }

只是觉得这些空白是不对的,但我也不知道我会做什么/做什么不同。

在实体属性不适用时将它们留空是否可以

2 个答案:

答案 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; }

如果可能,请避免使用字符串来表示数据,如果有更窄的原子数据类型以满足您的需求。当另一个开发人员看到一个字符串时,他立即需要知道几件不明显的事情:

  1. 允许哪些格式?有时,这些24小时或12小时?日期可能不明确,因为你不得不担心不同的格式,时区等......
  2. 是否允许空值?处理空字符串的方式与空字符串不同吗? (我希望不会)
  3. 是否有最大字符串长度?
  4. 数据是否已经过验证,或者是否包含无法解析的垃圾用户输入?
  5. 上述所有内容都可以通过文档或数据属性明确传达......但即使您使用DateTime?,它仍然只是更简单不需要日期部分。