【问题标题】:Decimal Type Losing All Precision When Adding Via EF4.1 NavigationProperty, Possible Framework Bug?通过 EF4.1 NavigationProperty 添加时,十进制类型丢失所有精度,可能的框架错误?
【发布时间】:2011-08-25 14:27:42
【问题描述】:

我创建了一个示例项目,您可以下载here

手动重新创建的步骤:

  1. 创建新的 MVC3 Web 项目。
  2. 添加 .edmx
  3. 创建一个名为“帐户”的实体。
  4. 创建一个名为“AccountLineItem”的实体。
  5. 将 Decimal 字段添加到“AccountLineItem”。
  6. 在“Account”和“AccountLineItem”之间创建一对多关联,确保选中在“Account”上创建导航属性的选项。
  7. 添加代码以在任何地方更新数据库,我在 HomeController 上使用了 Index():

    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
    
        using (var db = new TestStoreContainer())
        {
            Account acc = new Account();
            acc.Name = "Test Account";
    
            AccountLineItem accItem = new AccountLineItem();
            accItem.Amount = 22.10M;
    
            acc.AccountLineItems.Add(accItem);
    
            db.Accounts.AddObject(acc);
            db.SaveChanges();
        }
    
        return View();
    }
    

如您所见,我正在使用一个 Account 和一个值为 22.10 的 AccountLineItem 更新数据库;但是,运行这段代码后,SQLEXPRESS 中出现的值 22 没有精度。

我使用 SQL 2008 R2 机器发现了这种行为,所以我认为问题不在于 Express。

其他人可以复制这种行为吗?我在做一些公然错误的事情吗?欢迎所有反馈。

【问题讨论】:

  • 检查Amount 列的数据类型。我可能是 int 而不是 decimal 或者精度为 0
  • 此外,如果您将相同的字段添加到“帐户”实体,则值会精确存储。

标签: .net asp.net-mvc-3 entity-framework-4 ef-model-first


【解决方案1】:

正如您在评论中提到的那样

'[Amount] decimal(18,0) NOT NULL'

这一行告诉我们

  1. 列名是金额
  2. 数据类型为十进制
  3. 精度是 18 位,可以存储在左侧和右侧 小数点。
  4. 刻度为0位,可存储在小数点右侧。

因此您必须更改刻度值以将数字保存到小数点右侧。你不能使用EF 来做到这一点,你必须从 sql server management studio 中更改它。

【讨论】:

  • 这非常有效。我被甩了,因为这只会在从 NavigationProperty 添加时表现出来。如果我在主实体上以相同的方式 (18,0) 创建一个十进制字段,它会精确保存。至少可以说令人困惑的行为。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2013-06-17
相关资源
最近更新 更多