Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是更好的设计/实践:可空属性或1值属性和1 bool“;有",;财产?_C#_Asp.net Mvc_Data Modeling_Code First - Fatal编程技术网

C# 什么是更好的设计/实践:可空属性或1值属性和1 bool“;有",;财产?

C# 什么是更好的设计/实践:可空属性或1值属性和1 bool“;有",;财产?,c#,asp.net-mvc,data-modeling,code-first,C#,Asp.net Mvc,Data Modeling,Code First,我正在开发一个ASP.NETMVC应用程序,设计域模型,使用(测试)新的EF代码优先功能 我有一个活动实体,可能有也可能没有截止日期,最好的方法是什么 1财产: public DateTime? Deadline {get; set;} and check vs null before using 或 2个属性: public DateTime Deadline {get; set;} public bool HasDeadline {get; set;} 起初我想到了第一个选项,但后来

我正在开发一个ASP.NETMVC应用程序,设计域模型,使用(测试)新的EF代码优先功能

我有一个活动实体,可能有也可能没有截止日期,最好的方法是什么

1财产:

public DateTime?  Deadline {get; set;}
and check vs null before using

2个属性:

public DateTime Deadline {get; set;}
public bool HasDeadline  {get; set;}
起初我想到了第一个选项,但后来我开始想,也许第二个选项会更好地考虑DB


这方面有什么最佳实践吗?

我会选择第一个选项。毕竟,它正是第二个的封装形式

封装清楚地表明,您只有一个逻辑值(或缺少逻辑值)。在第二种形式中,您可以将属性视为完全独立的,而逻辑上它们不是


就数据库而言,我希望第一个表单也同样简单。。。假设数据库中有一个可为空的DATETIME字段,是吗?它应该直接映射。

我会使用第一个选项。从长远来看,第二个选项可能会导致一些维护问题,因为您必须记住检查并使用这两个属性


还有一种选择是使用一个属性,但不是使其可为NULL,您可以返回一个(也称为)。

数据库用于存储NULL值-将Min值存储在databasea中,然后使用一个标志指示您是否应该信任该值,这会使查询变得复杂

我喜欢可空类型,因为它反映了域的意图——没有日期,而不是“没有日期,所以假设1970年1月1日意味着没有日期”

维护hasdelaine值还有一个开销——您需要在每次更新相应属性时设置它。还有,你是怎么清理的?如果您将截止日期设置为日期,则它会将HasDailate设置为true。我如何“取消”它?是否将HasDudate设置为false,但将Dudate字段与之前的值保持不变


总的来说很讨厌。

您应该使用nullable,因为它正是您想要的。使用两个单独的属性意味着您将失去它们之间的连接,您需要用文档说明它们之间的关系


可以为null的类型也应该更适合于数据库类型,但是您应该首先设计对象作为对象的工作方式,而不是如何将其存储在数据库中。如果使用数据库生成工具导致您在设计代码时做出错误的决策,则会适得其反。

为了使代码更具可读性,将两者结合使用如何

public DateTime? Dealine{get; set;}
public bool HasDeadline
{
    get
    {
        return (Deadline != null);
    }
}
它易于阅读,而且做的事情与消费者无论如何都必须做的事情完全相同。此外

if(HasDeadline)
    doStuff();
阅读比阅读容易

if(Dealine != null)
    doStuff();

:)

所有这些问题都存在于
Nullable
中,而且“如果HasValue为false,则从值获取程序中抛出异常”的解决方案也不是很好,IMHO。它们的存在是什么意思?因为我可以将
null
赋值给
null
类型,所以我有一个非常简单的方法来“清除”该值。既然我不能将
null
分配给
DateTime
我如何指示实体不再设置截止日期?当然,永远不要为非异常的事物抛出异常。这就是HasValue存在的原因,因此您可以在做某事之前对其进行评估。我的观点是,Nullable上的HasValue是为您准备的。它简单易用,不需要重复使用。你不能将
null
分配给
null
,编译器在骗你。实际上,您正在分配
default(Nullable)
(即默认构造的
Nullable
),这是一种值类型,意味着原始二进制归零--
HasValue
变为false,
value
变为
default(T)
无论
T
的全零值意味着什么。我的观点正是这样。从编写代码的角度来看,我现在可以将null赋值给DateTime,它负责为我设置HasValue。如果您自己执行此操作,而不是使用可为空的类型,则每次都需要实现此逻辑。为什么要重新发明轮子?如果
hasdimdate
只影响
deadimdate
列,我会选择第一个选项。如果它影响多个字段或行为,则可以使用单独的列(是否有一个只有在有截止日期时才有意义的
overduepaulation
列?)。想想你是否会有很多关于
WHERE NOT ISNULL('Deadline')
的查询,因为
WHERE'hasdadline'
感觉更干净。既然他先在域模型上编写代码,谁会在乎SQL是什么样子呢?让域变得漂亮、可用,然后再考虑它的数据库方面。LINQ中也会出现这种差异。谢谢,很高兴看到我的第一个想法是好的。。。该死的三思。。另外,实现一个没有setter并返回Deadline的hasdadline属性怎么样=无效的只是为了“美化”代码?哈哈,已经建议过了。还允许您在其中添加检查,例如
截止日期必须在该日期之后,而不是在过去
之类的内容:
if(deadline.Hasvalue)
而不是
if(hasdaldate)
。由于
Nullable
具有内置的
HasValue
方法,因此不需要与null进行比较。