【问题标题】:Use money type in Entity Framework model first首先在实体框架模型中使用货币类型
【发布时间】:2011-09-16 16:47:01
【问题描述】:

我创建了一个表,其中包含一个名为 Amount 的列,并将其设置为 Decimal。我找不到在哪里将其设置为 money 或 smallmoney,当我尝试设置像 0.2 这样的值时,它会四舍五入为 0....

如何在实体框架中使用金钱?

谢谢!

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    我的回答是关于 E.F 6.0 处理类似问题并使用 SQL Profiler 检查后: 实体框架在 SQL 中将 Decimal 变量类型转换为 Decimal(18, 2)。

    如果你想省钱类型,我建议使用数据注释并添加

    public class Account
    {
        public int AccountId { get; set; }                
    
        [Column(TypeName="money")]
        public decimal Amount { get; set; }
    }
    

    或者如果你使用 Fluent API

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Account>()
                    .Property(i => i.Amount)
                    .HasColumnType("money");
    }
    
    • Money 类型将转换为 (19, 4)

    【讨论】:

    • 这个解决方案对我很有效。需要注意的一件事:如果您处理的是小数金额(即 5.0125),则必须使用上面的数据注释,否则金额将四舍五入到小数点后 2 位。在我的特殊情况下,我不希望这种情况发生。
    【解决方案2】:

    Entity Framework 的一个令人讨厌的地方是它在 SQL 中将 Decimal 变量类型转换为 Decimal(18, 0)。

    逗号后面的数字是数字允许的小数位数。所以 Decimal(18,0) 保存时会去掉小数点后的数字。

    转到 SQL Server Management stuido,找到您的数据库,右键单击表并选择“设计”。然后从列表中选择列,您只需在框中键入即可将数据类型更改为 Decimal(18, 2)。然后将更改保存到表中。然后它将数字保存到西方货币交易中通常使用的小数点后两位。如果您需要更多小数位,只需相应增加括号内的第二个数字即可。

    我从未找到更改此 EF 默认值以便生成 Decimal(18, 2) 的设置。但后来我从来没有看过:在数据库中更改很容易。但如果有人知道,我很想知道它是如何完成的。

    编辑:更多信息 - 包括配置修复 - 在这个答案中: Decimal precision and scale in EF Code First

    【讨论】:

    • 嗯,我没有使用 EF 6/6.1 的这种经验,我所有的小数都保存在 (18,2) 中
    • 我无法评论 EF6(未使用它),但我确信我记得早期版本中发生过这种情况。我想可能是笨拙的实现 - 会在网上挖掘一下。
    • 请注意,考虑到全球软件,2 位小数对于货币来说并不总是足够的。
    【解决方案3】:

    所以我认为您的问题可能是代码优先方法。另外,我不确定您使用的是什么版本的 SQL,我下面的答案仅适用于 SQL Server。但是对于 Oracle 或 MySQL,您基本上会以相同的方式进行操作。

    模型优先:

    使用 SQL Server,您只需为字段选择“money”或“smallmoney”,具体取决于您需要表示的值有多大。

    代码优先:

    我需要表达一种最高为 9999.99 的货币类型

    在可视化 EDMX 编辑器中,您将选择标量属性,转到属性,然后将其设置为 Type = Decimal,然后将 Facets 设置为 Precision = 6 Scale = 2。您可以使用 Data Annotations 确保该字段显示并输入为钱。

    【讨论】:

      【解决方案4】:

      这类似于Decimal precision and scale in EF Code First .我首先使用 EF 6.1 和代码,由于某种原因,默认事件将 smallmoney 定义为精度 2,尽管它是/应该是 4。您需要添加一些 Fluent 代码来解决这个问题。 我使用类似的东西:

      public static void OnModelCreating(DbModelBuilder modelBuilder)
      {
              modelBuilder.Entity<MYCLASSNAME>().Property(x => x.MYPROPNAME).HasPrecision(5+4, 4);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多