在我的用例中,我需要一个必需的布尔属性,例如:
public class Todo
{
[Required]
public bool IsDone {get; set; }
}
由于缺少布尔属性的属性映射(未设置值),我在Entity Framework项目中遇到了一个错误。因此,我总是存储默认的布尔值'false',而它实际上没有填充。如果没有填写,我希望抛出一个验证异常,但因为它是一个原始类型,验证属性没有任何意义,因为它总是有一个默认值这足以通过。我不希望有一个默认值,并且验证属性应该在未设置值时抛出异常。
我想出的解决方案是使用具有必需属性的可空布尔值。如果未设置该属性,则必需属性将抛出异常,这很好。另一方面,拥有一个必需的可空布尔值是非常奇怪的,因为你知道它总是被填充(由于所需的属性)并且它使得关于这个属性的业务逻辑不那么可读(IsDone.HasValue?IsDone.Value:false; /不可能,因为它是必需的/)。
还有其他解决方案吗?
这里有很多选择。你想要的是一个三重状态机制:not set,true,false
Nullable bool确实提供了这一点,但主要问题是消费者是否清楚这一点。
第二种选择是创建三态枚举并使用它。
在这两者之间,我会自己带着一个可以自欺欺人的布尔。最后,这是一个挑选你的毒药的情况。