首先在Entity Framework模型中使用money类型

时间:2011-06-16 20:03:00

标签: c# entity-framework

我创建了一个名为Amount的列的表,我将其设置为Decimal。我无法找到将其设置为money或smallmoney的位置,当我尝试将值设置为0.2时,它会舍入为0 ....

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

谢谢!

5 个答案:

答案 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");
}
  • 资金类型将转换为(19,4)

答案 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等。 创建数据库中的表时,可以检查映射表,如果需要,可以更改默认映射