EF 警告 - 如果配置的精度和小数位数与数据库中的列类型不匹配,这将导致值被无提示截断



最近我们将一个项目从ADO.net迁移到EntityFramework 7。在日志文件中,我们注意到如下的多个警告:

十进制属性'ObjectId'是实体类型键的一部分"AppointmentSchedule"。如果配置的精度和比例不匹配数据库中的列类型,这将导致值为如果它们不适合默认精度和规模。考虑使用不同的属性作为键,或者确保数据库列类型与模型配置匹配使用'SET NUMERIC_ROUNDABORT ON'启用十进制四舍五入警告

做了一些研究,并根据论坛的建议,尝试了以下方法

设置,

  1. .HasColumnType("数字(9,0)");
  2. .HasPrecision("数字(9,0)")

也尝试设置EF模型属性上的数据注释

[Column(TypeName = "numeric(9, 0)")] 
public decimal ObjectId { get; set; }

以上都没有帮助。我们仍然看到警告。有什么建议如何避免这些警告吗?

一个解决方案是使用DbContextOptionsBuilder.ConfigureWarnings。查看GitHub问题的答案和Microsoft文档

var contextOptions = new DbContextOptionsBuilder<MyDbContext>()
.ConfigureWarnings(w => w.Ignore(SqlServerEventId.DecimalTypeKeyWarning))
.UseSqlServer(@"...connectionString")
.Options;
using var context = new MyDbContext(contextOptions);

您有一个decimal类型属性,并试图将其数据存储在具有9位小数和0位的SQL数字类型中。这意味着不能存储小数点之后的任何内容。问题是ObjectId应该是int而不是decimal

同样,由于最大int大小为2147483647,您应该使SQl类型允许10位数字:

[Column(TypeName = "numeric(10, 0)")]

最新更新