我创建了一个名为Amount的列的表,我将其设置为Decimal。我无法找到将其设置为money或smallmoney的位置,当我尝试将值设置为0.2时,它会舍入为0 ....
如何在实体框架中使用资金?
谢谢!
答案 0 :(得分:3)
关于Entity Framework的一个令人讨厌的事情是它在SQL中将Decimal变量类型转换为Decimal(18,0)。
逗号后面的数字是数字上允许的小数位数。因此,十进制(18,0)将在保存时删除小数点后的数字。
转到SQL Server Management stuido,找到您的数据库,右键单击该表并选择" Design"。然后从列表中选择列,您只需在框中输入即可将数据类型更改为十进制(18,2)。然后将更改保存到表中。然后它将数字保存到西方货币交易中使用的通常的两位小数。如果您需要更多小数位,只需相应增加括号内的第二个数字。
我从未找到过更改此EF默认设置的设置,因此它会生成十进制(18,2)。但后来我从来没有看过:在数据库中改变它很容易。但如果有人知道,我很想知道它是如何完成的。
编辑:更多信息 - 包括配置修复 - 在这个答案中: Decimal precision and scale in EF Code First
答案 1 :(得分:1)
我的回答是关于E.F 6.0 处理完类似问题并使用SQL事件探查器检查后: 实体框架将Decimal变量类型转换为SQL中的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");
}
答案 2 :(得分:0)
所以我认为您的问题可能是代码第一种方法。另外,我不确定您使用的是哪个版本的SQL,我的答案仅适用于SQL Server。但您基本上也可以使用相同的方式为Oracle或MySQL执行此操作。
模型第一:
使用SQL Server,您只需选择&#34; money&#34;或&#34; smallmoney&#34;对于该字段,取决于您需要表示的值的大小。
代码优先:
我需要表达最高9999.99的款项
在visual EDMX编辑器中,您将选择标量属性,转到Properties然后将其设置为Type = Decimal,然后将Facets设置为Precision = 6 Scale = 2.您可以使用Data Annotations来确保该字段显示&amp;作为钱输入。
答案 3 :(得分:0)
这类似于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);
}
答案 4 :(得分:-2)
应用一些代码,您使用哪个版本的EF等。 创建数据库中的表时,可以检查映射表,如果需要,可以更改默认映射