十进制的最佳数据注释(18,2)

时间:2013-11-06 11:41:11

标签: c# asp.net-mvc entity-framework

我的sql server 2008里面有一列Decimal(18,2)。但是在实体框架中,我可以在我的asp.net MVC Web应用程序中应用于此属性的最佳数据注释验证是什么?

8 个答案:

答案 0 :(得分:51)

小数没有明确的数据注释,因此您需要使用两个单独的注释来添加约束。

两个小数点

[RegularExpression(@"^\d+\.\d{0,2}$")]

此正则表达式将确保该属性最多包含两位小数。

最多18位

[Range(0, 9999999999999999.99)]

假设您不接受任何负数。否则,请将0替换为-9999999999999999.99

结果

[RegularExpression(@"^\d+\.\d{0,2}$")]
[Range(0, 9999999999999999.99)]
public decimal Property { get; set; }

答案 1 :(得分:14)

我认为@ jumpingcode的答案可以合并为一个RegularExpressionAttribute

[RegularExpression(@"^(0|-?\d{0,16}(\.\d{0,2})?)$")]
public decimal Property
{
    get;
    set;
}

这可用于任何precisionscale。 16替换为precision - scale,而2替换为scale。正则表达式应匹配输入的数字,如###0.##.##0###.##以及负值。

答案 2 :(得分:4)

这似乎是正确的答案(上述答案要么限制可以插入到Decimal(18,2)数据类型的有效数字,要么将编译错误应用到您的代码中 - 请自行确认):

一起使用以下两个约束:

两个小数点

[RegularExpression(@"^\d+.?\d{0,2}$", ErrorMessage = "Invalid Target Price; Maximum Two Decimal Points.")]

最多18位

  [Range(0, 9999999999999999.99, ErrorMessage = "Invalid Target Price; Max 18 digits")]

答案 3 :(得分:3)

对于某些人可能认为更具可读性的方法,您可以覆盖DbContext的OnModelCreating方法来设置精度,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

           modelBuilder.Entity<YourEntity>()
                    .Property(x => x.TheProprty)
                    .HasPrecision(18, 2);
    }

优势:强类型与自定义正则表达式

缺点:只需扫描就无法在课堂上看到它

答案 4 :(得分:2)

下面是@Schmalls示例(并注释将其重新构建为属性),我创建了一个工作示例(使用C#6字符串插值):

public class PrecisionAndScaleAttribute : RegularExpressionAttribute
{
    public PrecisionAndScaleAttribute(int precision, int scale) : base($@"^(0|-?\d{{0,{precision - scale}}}(\.\d{{0,{scale}}})?)$")
    {

    }
}

用法:

[PrecisionAndScale(6, 2, ErrorMessage = "Total Cost must not exceed $9999.99")]
public decimal TotalCost { get; set; }

答案 5 :(得分:1)

 [Range(1,(double) decimal.MaxValue, ErrorMessage="value should be between{1} and {2}."]

答案 6 :(得分:0)

我几乎完全使用(b / c简单而有效)

[Range(typeof(decimal), "0", "1")]
public decimal Split { get; set; }

然后,如果我需要转换回双倍,我添加一个转换

(double)model.Split

答案 7 :(得分:0)

如果您编写“列”注释,将可以正常工作

    [Required]
    [Column(TypeName = "decimal(18, 6)")]
    public decimal Foo { get; set; }