保存时,第三个小数更改为0

时间:2015-02-13 13:11:25

标签: c# sql-server entity-framework

我正在尝试在MsSQL数据库中存储一个带有三位小数的值,但由于某种原因,第三个小数总是更改为0。我无法弄清楚原因。

该项目由其他人Entity Framework code first v4.0.30319创建,并在数据库[Amount] [decimal](18, 2) NULL中创建了一个列。我已手动将数据库更改为[Amount] [decimal](18, 3) NULL

在代码中:

var _yourbid = form["YourBid"]; // value = 10.123
decimal yourbid;

if (decimal.TryParse(_yourbid, out yourbid))
{
    Bid b = new Bid();
    b.Amount = yourbid;

    //yourbid  = 10.123
    //b.Amount = 10.123

    Db.Bids.Add(b);
    Db.Save();

    //in database is 10.120
}

现在我预计code first某处声明小数的比例为2,但我找不到任何东西。我检查了Decimal precision and scale in EF Code First中列出的选项,但没有使用。

数据库上没有可能正在更改它的触发器。我可以直接从SQL

输入正确的值

我必须遗漏一些明显的东西,但我希望你能指出我正确的方向。

1 个答案:

答案 0 :(得分:2)

这可能是因为您的Entity Framework模型和底层数据库不再匹配。对于Entity Framework Code First项目,您应首先更新模型,然后使用迁移功能将更改传播到数据库。在此之前,您应该更改数据库表上的Amount字段,使其精度再次为2,以便检测差异。

要更新模型,请参阅以下有关如何自定义十进制字段精度的答案:

Decimal precision and scale in EF Code First

(在以后的EF版本中,事情会更容易,因此您可能希望在将来的某个时候考虑升级。)

然后,您应该添加一个迁移,它将记录要应用于数据库的SQL操作。在程序包管理器控制台中使用Add-Migration来执行此脚手架步骤。最后,您还应Update-Database在目标数据库上执行更改。

网络上有更多背景信息,包括Microsoft的本教程:https://msdn.microsoft.com/en-gb/data/jj591621.aspx

修改

这里有一些将执行精度更改的迁移代码。如果您运行旧版EF并且无法使用HasPrecision,则可能需要手动创建此项:

public partial class PrecisionChange : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.SomeTable", "Amount", (c => c.Decimal(false, 18, 3)));
    }

    public override void Down()
    {
        AlterColumn("dbo.SomeTable", "Amount", (c => c.Decimal(false, 18, 2)));
    }
}