gpt4 book ai didi

ef-code-first - Entity Framework 代码首先截断我的小数

转载 作者:行者123 更新时间:2023-12-04 00:52:18 25 4
gpt4 key购买 nike

我在 MVC 5 应用程序上使用 Code First 方法使用 Entity Framework 6.x。在这种特殊情况下,我的模型(除其他外)包含两个名为 Latitude 和 Longitude 的属性:

[Required, Range(-90, +90)]
public decimal Latitude { get; set; }

[Required, Range(-180, +180)]
public decimal Longitude { get; set; }

当我执行迁移时,我得到了这样的东西
CreateTable("ResProperty"), c => new {
:
Latitude = c.Decimal(nullable: false, precision: 10, scale: 8),
Longitude = c.Decimal(nullable: false, precision: 11, scale: 8),
:
})
... other stuff

所以纬度和经度都有 8 十进制数字。前者有 2 个整数(最多 90 个),后者有 3 个整数(最多 180 个)。

执行 Update-Database 命令后,我的表的列显示为:
Latitude decimal(10,8)
Longitude decimal(11,8)

这对我来说似乎很好。现在在我看来,我有一个 map 和 Javascript 代码,允许用户重新定位标记。这也很好用。当标记重新定位时,纬度和经度字段将填充更新后的值(Javascript)具有超过 12 位十进制数字。 AFAIK 这并不重要,因为我的比例是 8 位小数。

按下提交按钮并调用 Create 或 Edit POST 方法后,我检查模型实例,并确认模型中传递给 Controller ​​的实际值是正确的,它们有足够多的十进制数字(那些 Javascript 代码地方)。所以这个值是正确的。

现在......问题是在执行 db.SaveChanges() 之后数据库得到更新 - 我已经确认已经发生了实际的写入/更新 - 但不知何故 EF 在内部无视我的实际值并写入截断的纬度/经度仅四舍五入为两位十进制数字,因此我的纬度在数据库中显示为 09.500000000 所有其他十进制数字都为零,因为似乎发生了四舍五入。
// Prior to SaveChanges()
Latitude = 9.08521879
Longitude = -79.51658792
// After SaveChanges()
Latitude = 9.08000000
Longitude = -79.51000000

如果我给出了正确的比例和精度并且列也具有正确的比例和精度,为什么要舍入它?为什么 SaveChanges 会改变我的值?

我发现这篇文章( http://weiding331.blogspot.com/2014/01/entity-framework-decimal-value.html )是同样的问题,但我不知道如何解决这个问题(如果有的话),因为在有问题的表被“迁移”后,我已经执行了几次迁移和数据添加。

总结
  • 模型数据类型正确(十进制)
  • 数据库迁移代码具有正确的 precion/scale (lat 10/8 lon 11/8)
  • SQL 数据库列具有正确的精度/比例(lat 10/8,long 11/8)
  • 模型中传递的值对于纬度和经度都至少有 8 位十进制数字
  • 值的实际写入/更新发生在数据库中,没有错误,但是...
  • 数据库中为这两列记录的值被截断为两位十进制数字,并且
    将其他最低有效十进制数字显示为零 (0)
  • 最佳答案

    EF 有一个特殊的 SqlProviderServices 属性(SQL Server 的 SqlClient 提供程序的实现) - TruncateDecimalsToScale。
    默认值为 true,所以也许您可以将其更改为 false 值。例如:

    public class DbContextConfiguration : DbConfiguration
    {
    public DbContextConfiguration()
    {
    var now = SqlProviderServices.Instance;
    SqlProviderServices.TruncateDecimalsToScale = false;
    this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
    }

    [DbConfigurationType(typeof(DbContextConfiguration))]
    public class MyContext : DbContext
    { ... }

    更多相关信息: https://msdn.microsoft.com/en-us/library/system.data.entity.sqlserver.sqlproviderservices.truncatedecimalstoscale%28v=vs.113%29.aspx

    关于ef-code-first - Entity Framework 代码首先截断我的小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26392489/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com