最近我们将一个项目从ADO.net迁移到EntityFramework 7。在日志文件中,我们注意到如下的多个警告:
十进制属性'ObjectId'是实体类型键的一部分"AppointmentSchedule"。如果配置的精度和比例不匹配数据库中的列类型,这将导致值为如果它们不适合默认精度和规模。考虑使用不同的属性作为键,或者确保数据库列类型与模型配置匹配使用'SET NUMERIC_ROUNDABORT ON'启用十进制四舍五入警告
做了一些研究,并根据论坛的建议,尝试了以下方法
设置,
- .HasColumnType("数字(9,0)");
- .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)")]