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

g6baxovj  于 2022-12-24  发布在  .NET
关注(0)|答案(2)|浏览(191)

最近,我们将一个项目从www.example.com迁移ADO.net到EntityFramework 7。在日志文件中,我们注意到多个警告,如下所示:
decimal属性“ObjectId”是实体类型“AppointmentSchedule”上键的一部分。如果配置的精度和小数位数与数据库中的列类型不匹配,这将导致值在不符合默认精度和小数位数时被自动截断。请考虑使用其他属性作为键。或确保数据库列类型与模型配置匹配,并使用“SET NUMERIC_ROUNDABORT ON”启用小数舍入警告
做了一些研究,并按照论坛的建议,尝试了以下方法
尝试设置,
1..HasColumnType(“数字(9,0)”);
1..HasPrecision(“数字(9,0)”)
还尝试在EF模型属性上设置数据注记

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

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

jfewjypa

jfewjypa1#

您有一个decimal类型属性,并且尝试将其数据存储为9位数和0个小数位的SQL数值类型。这意味着将无法存储小数点之后的任何内容。问题是ObjectId可能应该是int,而不是decimal
此外,由于最大整数大小为2147483647,因此应使SQl类型允许10位数:

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

uyhoqukh2#

一个解决方案是使用DbContextOptionsBuilder.ConfigureWarnings。检查GitHub issue和Microsoft docs的答案

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

using var context = new MyDbContext(contextOptions);

相关问题