asp.net核心模型四位小数验证

时间:2017-09-25 19:34:44

标签: c# asp.net-core entity-framework-core data-annotations asp.net-core-2.0

在我的asp.net核心模型中,当我搭建我的数据库时,它只允许带有两个小数位的数字,如0.10但是,我不允许在我的数据库中插入四个小数位。

以下是我的模特。

     public class Order
{
    public int OrderID { get; set; }

    [RegularExpression(@"^\d+.\d{0,4}$", ErrorMessage = "Must have four decimal places")]
    [Range(0.0001, 1)]
    [Display(Name = "Goal Diameter Tolerance")]
     public decimal? GoalDiameterTolerance { get; set; }
}

以下是GoalDiameterTolerance脚手架。它只允许两位小数。我可以改变它但是,如何在模型中的脚手架之前修复它。

 GoalDiameterTolerance = table.Column<decimal>(type: "decimal(18, 2)", nullable: true),

我相信应该支持这个。

GoalDiameterTolerance = table.Column<decimal>(type: "decimal(18, 4)", nullable: true),

以下是我解决问题的方法。

foreach (var property in modelBuilder.Model
            .GetEntityTypes()
            .SelectMany(t => t.GetProperties())
            .Where(p => p.ClrType == typeof(decimal) ||
            p.ClrType == typeof(decimal?))
            .Select(p => modelBuilder.Entity(p.DeclaringEntityType.ClrType).Property(p.Name))
            )
        {
            property.HasColumnType("decimal(18,4)");
        }

1 个答案:

答案 0 :(得分:0)

我认为EF代码生成不会尝试从Display \ Validation属性中推断出列类型。您应该能够使用Column属性

显式指定所需的列类型
Column(TypeName = "decimal(18, 4)")

或者通过覆盖OnModelCreating并自定义列类型

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Entity<Order>()
            .Property(p => p.GoalDiameterTolerance)
            .HasPrecision(18, 4); 
}