Проверка базовой модели asp.net с четырьмя знаками после запятой

В моей модели в ядре 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)");
        }

person Alex Zimmerman    schedule 25.09.2017    source источник
comment
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = {0:#.####})] — еще один возможный способ, который не будет работать.   -  person Alex Zimmerman    schedule 25.09.2017


Ответы (1)


Я не думаю, что генерация кода 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); 
}
person shurik    schedule 25.09.2017
comment
stackoverflow.com/questions/41468722/ - person Alex Zimmerman; 26.09.2017
comment
Я использовал ссылку выше, я покажу функцию выше, которую я использовал. - person Alex Zimmerman; 26.09.2017
comment
Спасибо. Я не смог найти возможность указать информацию о столбцах в модели. - person Alex Zimmerman; 26.09.2017