【问题标题】:Model ignoring HasPrecision property模型忽略 HasPrecision 属性
【发布时间】:2018-10-05 01:07:48
【问题描述】:

我有一个 ASP.NET MVC5 应用程序,用于将数据从 CSV 文件上传到 SQL Server 2008 R2 数据库表中。

我有一个模特,

public partial class SURCH
{
    [Key]
    [Column(Order = 0)]
    [StringLength(30)]
    [Display(Name = "Alloy")]
    public string ALLOY { get; set; }

    [Key]
    [Column(Order = 1, TypeName = "date")]
    [Display(Name = "Effetive Start Date")]
    [DataType(DataType.Date)]
    public DateTime EFFECTIVE_START_DATE { get; set; }

    [Key]
    [Column(Order = 2, TypeName = "date")]
    [Display(Name = "Efective End Date")]
    [DataType(DataType.Date)]
    public DateTime EFFECTIVE_END_DATE { get; set; }

    [Display(Name = "Cost")]
    public decimal COST { get; set; }
}

在我的 DBContext 类中,我设置了小数字段 COST 的精度:

public partial class MyContext : DbContext
{
    public MyContext()
        : base("name=string")
    {
    }

    public virtual DbSet<SURCH> SURCH { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SURCH>()
            .Property(e => e.COST)
            .HasPrecision(38, 4);
    }
}

当我导入 CSV 文件时,我会遍历行并为每一行创建此模型的实例。 CSV 中的 COST 字段最多可以有 4 个小数位。当我创建模型实例时,模型中的 COST 字段确实具有正确的精度。但是,当我将模型添加到表中时,COST 字段总是被截断到小数点后 2 位。

这是我将模型列表添加到数据库的方法。

foreach (SURCH currentItem in SURCHlist)
{
    db.SURCH.Add(currentItem);
}

await db.SaveChangesAsync();

为什么我的数据会被截断?我认为 HasPrecision 属性会处理这个问题。

我已经尝试了一些方法。我尝试扩展 DbConfiguration 类并指定它不应该截断小数。我将此文件作为 DBContextConfiguration 保存在与我的 DBContext 类文件相同的文件夹中。

public class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        var providerInstance = SqlProviderServices.Instance;
        SqlProviderServices.TruncateDecimalsToScale = false;
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

我还尝试操作 HasPrecision 属性并使用模型上的 TypeName 字段指定小数精度,但无济于事。

编辑1:

CSV 输入数据示例:

1008M,1/1/1900,1/1/1900,0.119
100CRMO7,1/1/1900,1/1/1900,5.001

来自数据库的示例输出数据:

1008M       1/1/1900    1/1/1900    0.12
100CRMO7    1/1/1900    1/1/1900    5.00

编辑2: 我的数据库表:

CREATE TABLE [dbo].[SURCH](
    [ALLOY] [nvarchar](30) NOT NULL,
    [EFFECTIVE_START_DATE] [date] NOT NULL,
    [EFFECTIVE_END_DATE] [date] NOT NULL,
    [COST] [decimal](38, 4) NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [ALLOY] ASC,
    [EFFECTIVE_START_DATE] ASC,
    [EFFECTIVE_END_DATE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

【问题讨论】:

    标签: c# sql-server-2008 entity-framework-6


    【解决方案1】:

    在意识到有两个不同的问题后,我想通了:

    1) 我的模型无法识别 HasPrecision 属性。环顾一番后,我发现一篇文章解释了如何创建自己的 DataAnnotation 来指定精度。 In this article,作者在 DbContext 类的 OnModelCreating 函数中多了一行。我将此行添加到我的函数中,突然一切都正确保存到数据库中。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Added this line.
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.Entity<SURCH>()
            .Property(e => e.COST)
            .HasPrecision(38, 4);
    }
    

    2) 我的视图没有显示正确的格式。我假设由于数据库和模型使用小数点后 4 位的精度,我的视图会自动执行相同的操作。相反,它显示了默认的 2 位小数。为了纠正这个问题,我在我的模型中添加了一个 DataAnnotation,以将我的 COST 字段格式化为 4 位小数,包括在编辑模式下。

    [Display(Name = "Cost")]
    [DisplayFormat(DataFormatString = "{0:n4}", ApplyFormatInEditMode = true)]
    public decimal COST { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2021-04-30
      相关资源
      最近更新 更多