实体框架的十进制精度-0.0010保持为0.0000

时间:2018-08-04 05:31:52

标签: entity-framework decimal

我有一个代码优先项目,其中一个POCO包含一个十进制字段,该字段正在数据库中设置为:

rate = c.Decimal(nullable: false, precision: 18, scale: 4),

我可以在SQL数据库中看到它反映了正确的精度和小数位数。我需要它存储最多4位数的小数位,即大于0.0001的任何小数-但是,当保留值时发生的情况是-超出小数位数前两位数字的所有内容都保留为0。即-0.0100将被保留为0.0100然而-0.0090、0.0050或0.0010将全部保留为0.0000。我可能在这里忽略了一些明显的方面,但是我一直在寻找任何文档参考,而且到目前为止似乎还没有找到任何东西,我希望能从中获得任何线索。谢谢!

1 个答案:

答案 0 :(得分:0)

我在这里找到了答案,这似乎帮助我解决了问题。山姆说话的症状与我面对的完全一样。重做步骤Sam建议使用的似乎已解决了该问题。这是链接:

[关于此问题的Sam文章] [1] https://storiknow.com/entity-framework-decimal-scale-and-precision-convention/

已经在Sam的文章中实现了步骤,这导致了上下文创建方面的一个附带问题,并且在迁移添加过程中,我弹出了以下错误作为异常:

DatabaseAccess.databaseContext.ApplicationUserRole: : EntityType 'ApplicationUserRole' has no key defined. Define the key for this EntityType.

DatabaseAccess.databaseContext.ApplicationUserLogin: : EntityType 'ApplicationUserLogin' has no key defined. Define the key for this EntityType.

在我的情况下,通过在OnModelCreating()中添加以下几行来解决该问题:

modelBuilder.Entity<ApplicationUserRole>().ToTable("AspNetUserRoles").HasKey(ur => new { ur.RoleId, ur.UserId });
modelBuilder.Entity<ApplicationUserLogin>().ToTable("AspNetUserLogins").HasKey<int>(ul => ul.UserId); 

此处是整个OnModelCreating()定义:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Add(new decimalPrecisionAttributeConvention());


        modelBuilder.Entity<ApplicationUserRole>().ToTable("AspNetUserRoles").HasKey(ur => new { ur.RoleId, ur.UserId });
        modelBuilder.Entity<ApplicationUserLogin>().ToTable("AspNetUserLogins").HasKey<int>(ul => ul.UserId);           
    }

以防万一有人偶然发现同一问题。