【发布时间】: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