【发布时间】:2011-09-16 16:47:01
【问题描述】:
我创建了一个表,其中包含一个名为 Amount 的列,并将其设置为 Decimal。我找不到在哪里将其设置为 money 或 smallmoney,当我尝试设置像 0.2 这样的值时,它会四舍五入为 0....
如何在实体框架中使用金钱?
谢谢!
【问题讨论】:
标签: c# entity-framework
我创建了一个表,其中包含一个名为 Amount 的列,并将其设置为 Decimal。我找不到在哪里将其设置为 money 或 smallmoney,当我尝试设置像 0.2 这样的值时,它会四舍五入为 0....
如何在实体框架中使用金钱?
谢谢!
【问题讨论】:
标签: c# entity-framework
我的回答是关于 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");
}
【讨论】:
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
【讨论】:
所以我认为您的问题可能是代码优先方法。另外,我不确定您使用的是什么版本的 SQL,我下面的答案仅适用于 SQL Server。但是对于 Oracle 或 MySQL,您基本上会以相同的方式进行操作。
模型优先:
使用 SQL Server,您只需为字段选择“money”或“smallmoney”,具体取决于您需要表示的值有多大。
代码优先:
我需要表达一种最高为 9999.99 的货币类型
在可视化 EDMX 编辑器中,您将选择标量属性,转到属性,然后将其设置为 Type = Decimal,然后将 Facets 设置为 Precision = 6 Scale = 2。您可以使用 Data Annotations 确保该字段显示并输入为钱。
【讨论】:
这类似于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);
}
【讨论】: