原始类型的必需属性没有意义

问题描述 投票:2回答:1

在我的用例中,我需要一个必需的布尔属性,例如:

public class Todo 
{ 
    [Required] 
    public bool IsDone {get; set; } 
}

由于缺少布尔属性的属性映射(未设置值),我在Entity Framework项目中遇到了一个错误。因此,我总是存储默认的布尔值'false',而它实际上没有填充。如果没有填写,我希望抛出一个验证异常,但因为它是一个原始类型,验证属性没有任何意义,因为它总是有一个默认值这足以通过。我不希望有一个默认值,并且验证属性应该在未设置值时抛出异常。

我想出的解决方案是使用具有必需属性的可空布尔值。如果未设置该属性,则必需属性将抛出异常,这很好。另一方面,拥有一个必需的可空布尔值是非常奇怪的,因为你知道它总是被填充(由于所需的属性)并且它使得关于这个属性的业务逻辑不那么可读(IsDone.HasValue?IsDone.Value:false; /不可能,因为它是必需的/)。

还有其他解决方案吗?

c# entity-framework asp.net-web-api data-annotations
1个回答
1
投票

这里有很多选择。你想要的是一个三重状态机制:not set,true,false

Nullable bool确实提供了这一点,但主要问题是消费者是否清楚这一点。

第二种选择是创建三态枚举并使用它。

  • 它更清楚吗?也许
  • 它是可扩展的吗?是的,但我们真的需要超过3个州吗?

在这两者之间,我会自己带着一个可以自欺欺人的布尔。最后,这是一个挑选你的毒药的情况。

© www.soinside.com 2019 - 2024. All rights reserved.