EF Code First中的十进制精度和比例

.net c# decimal ef-code-first entity-framework

我正在尝试这种代码优先的方法,但我现在发现System.Decimal类型的属性被映射到decimal(18,0)类型的sql列。

如何设置数据库列的精度?

一般承认的答案

Dave Van den Eynde的答案现已过时。有两个重要的变化,从EF 4.1开始,ModelBuilder类现在是DbModelBuilder ,现在有一个DecimalPropertyConfiguration.HasPrecision方法,其签名为:

public DecimalPropertyConfiguration HasPrecision(
byte precision,
byte scale )

其中precision是db将存储的总位数,无论小数点落在何处,scale是它将存储的小数位数。

因此,不需要迭代所示的属性,但可以从中调用

public class EFDbContext : DbContext
{
   protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
   {
       modelBuilder.Entity<Class>().Property(object => object.property).HasPrecision(12, 10);

       base.OnModelCreating(modelBuilder);
   }
}

热门答案

如果要在DbModelBuilder设置所有decimals的精度,可以替换DbModelBuilder使用的默认DecimalPropertyConvention约定:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
    modelBuilder.Conventions.Add(new DecimalPropertyConvention(38, 18));
}

DecimalPropertyConvention中的默认DecimalPropertyConventiondecimal属性映射到decimal(18,2)列。

如果只希望单个属性具有指定的精度,则可以在DbModelBuilder上设置实体属性的DbModelBuilder

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyEntity>().Property(e => e.Value).HasPrecision(38, 18);
}

或者,为指定精度的实体添加EntityTypeConfiguration<>

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new MyEntityConfiguration());
}

internal class MyEntityConfiguration : EntityTypeConfiguration<MyEntity>
{
    internal MyEntityConfiguration()
    {
        this.Property(e => e.Value).HasPrecision(38, 18);
    }
}


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因