插入时删除比例数字(超过2位数)

时间:2017-11-30 17:44:43

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

我定义了一个像这样的表格列:

Column name: Lat
DataType: decimal(9,6)

我的模型定义:

    [DisplayFormat(DataFormatString = "{0:000.000000}", ApplyFormatInEditMode = true)]
    [Column(TypeName = "decimal")]
    public decimal Lat { get; set; }

[如上所述,我手动将列更改为十进制(9,6)]
我使用EF6在数据库中创建新记录。

当我想为Lat插入值 35.6997311 时,数据库中的结果为 35.690000 (4位数转换为零)。

为什么EF删除数字并插入零而不是它们?以及如何在数据库中插入完整的数字?

我的控制器插入操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,Lat,CreatedAt")] Example example)
{
    if (ModelState.IsValid)
    {
        db.Agencies.Add(example);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(example);
}

1 个答案:

答案 0 :(得分:2)

您可以创建一个属性来缩放数字。

像这样创建一个DecimalPrecision属性;

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class DecimalPrecision : Attribute
{
    public byte precision { get; set; }
    public byte scale { get; set; }
    public DecimalPrecision(byte precision, byte scale)
    {
        this.precision = precision;
        this.scale = scale;
    }
    public static void ConfigureModelBuilder(DbModelBuilder modelBuilder)
    {
        modelBuilder.Properties().Where(x => x.GetCustomAttributes(false).OfType<DecimalPrecision>().Any())
            .Configure(c => c.HasPrecision(c.ClrPropertyInfo.GetCustomAttributes(false).OfType<DecimalPrecision>().First()
                .precision, c.ClrPropertyInfo.GetCustomAttributes(false).OfType<DecimalPrecision>().First().scale));
    }
}

然后在您的上下文OnModelBuilder函数中,调用DecimalPrecision.ConfigureModelBuilder()方法

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    DecimalPrecision.ConfigureModelBuilder(modelBuilder);
}

<强>用法;

在属性上添加DecimalPrecision属性;

[DisplayFormat(DataFormatString = "{0:000.000000}", ApplyFormatInEditMode = true)]
[Column(TypeName = "decimal")]
[DecimalPrecision(9,6)]
public decimal Lat { get; set; }