我正在开发一个ASP.NET MVC应用程序,设计域模型,使用(测试)新的EF Code First功能。
我有一个可能有或没有截止日期的活动实体,接近它的最佳方式是什么?
1属性:
public DateTime? Deadline {get; set;}
and check vs null before using
或
2个属性:
public DateTime Deadline {get; set;}
public bool HasDeadline {get; set;}
起初我想到了第一个选项,但后来我开始认为第二个选项可能会更好地关于数据库......
有关于此的最佳做法吗?
答案 0 :(得分:10)
我会选择第一个选项。毕竟,完全是第二种形式的封装形式。
封装清楚地表明您只有一个逻辑值(或缺少它)。在第二种形式中,您可以将属性视为完全独立,这在逻辑上不是。
就数据库而言,我希望第一种形式也同样容易...预测你在数据库中有一个可以为空的DATETIME字段,不是吗?它应该直接映射。
答案 1 :(得分:3)
两者的结合只是为了让你的代码更具可读性?
public DateTime? Dealine{get; set;}
public bool HasDeadline
{
get
{
return (Deadline != null);
}
}
它易于阅读,并且与消费者无论如何都必须做同样的事情。此外...
if(HasDeadline)
doStuff();
比
更容易阅读if(Dealine != null)
doStuff();
:)
答案 2 :(得分:1)
我会使用第一个选项。从长远来看,第二个选项可能会导致一些维护问题,因为您必须记住检查并使用这两个属性。
另外一个选项是使用一个属性,但不是让它可以为空,你可以返回Null object(也称为Special Case)。
答案 3 :(得分:1)
数据库用于存储NULL值 - 在数据库中存储Min值,然后有一个标志来指示您是否应该信任该值会使查询变得复杂。
我喜欢可空类型,因为它反映了域名的意图 - 没有日期,没有'没有日期,所以假装1970年1月1日意味着没有日期'。
还有维护HasDealine值的开销 - 每次更新相应的属性时都需要设置它。另外你怎么清楚它?如果将截止日期设置为日期,则会将HasDeadline设置为true。我怎么'取消'它?你会将HasDeadline设置为false,但是将Deadline字段保留为前一个值吗?
整体icky。
答案 4 :(得分:1)
你应该使用nullable,因为它正是你想要的。使用两个单独的属性意味着您失去了它们之间的连接,您需要向文档说明它们之间存在关系。
可空类型也应该更适合数据库类型,但是您应该首先设计对象的工作方式,而不是如何将其存储在数据库中。如果使用数据库生成工具导致您在设计代码时做出错误的决定,则会产生相反的效果。