我正在尝试在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
我必须遗漏一些明显的东西,但我希望你能指出我正确的方向。
答案 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)));
}
}