Entity Framework Core - 将小数精度和小数位数设置为所有小数属性[重复]
Posted
技术标签:
【中文标题】Entity Framework Core - 将小数精度和小数位数设置为所有小数属性[重复]【英文标题】:Entity Framework Core - setting the decimal precision and scale to all decimal properties [duplicate] 【发布时间】:2017-09-02 18:44:53 【问题描述】:我想将所有小数属性的精度设置为 (18,6)。在 EF6 中,这很容易:
modelBuilder.Properties<decimal>().Configure(x => x.HasPrecision(18, 6));
但我似乎在 EF Core 中找不到类似的东西。删除级联删除约定并不像在 EF6 中那么简单,因此我找到了以下解决方法:
EF6:
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
EF 核心:
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
relationship.DeleteBehavior = DeleteBehavior.Restrict;
在阅读this 之后,我尝试了类似的方法:
foreach (var entityType in modelBuilder.Model.GetEntityTypes()
.SelectMany(x => x.GetProperties())
.Where(x => x.ClrType == typeof(decimal)))
// what to do here?
我想知道我是否在正确的轨道上以及如何继续,或者如果没有,我是否应该开始在所有 decimal
属性上添加数据注释。
【问题讨论】:
有一个相当粗暴的方法,但不知道是否有更优雅和灵活的方法。您可以使用modelBuilder.Entity<MyEntity>(c => c.HasColumn("DECIMAL(10,6"))
对其进行配置以指定列的类型。但是,它可能会将您耦合到某些类型的数据库,因为这些类型是特定于数据库的
这样我必须在 OnModelCreating
方法中列出所有小数属性,这与向所有这些属性添加 DataAnnotations 没有什么不同,这是我试图避免的:)
因为我必须继续开发,所以我手动设置了所有 198 个十进制属性(希望我没有遗漏任何一个),但是如果有人想到如何循环遍历所有这些属性,请告诉我
【参考方案1】:
你已经接近了。这是代码。
foreach (var property in modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetProperties())
.Where(p => p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?)))
// EF Core 1 & 2
property.Relational().ColumnType = "decimal(18, 6)";
// EF Core 3
//property.SetColumnType("decimal(18, 6)");
// EF Core 5
//property.SetPrecision(18);
//property.SetScale(6);
// EF Core 6
protected override void ConfigureConventions(
ModelConfigurationBuilder configurationBuilder)
configurationBuilder.Properties<decimal>()
.HavePrecision(18, 6);
【讨论】:
3 小时前我开始输入所有 200 个属性时,您在哪里? :D 我把头撞到了墙上,因为我以前用过它并且它有效,但突然之间它不适用于新的实体类型。原来我的decimal
类型实际上是一个可以为空的decimal?
。要为两者设置默认值,请确保使用 Where(p => p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?))
匹配这两种类型
有没有办法以强类型的方式设置精度?有没有HasPrecision
fluent 方法?
@Shimmy 还没有。由问题#11614跟踪。
这运行良好,但 EFCore3 出现问题 - 现在得到 'IMutableProperty' does not contain a definition for 'Relational' and no accessible extension method 'Relational' accepting a first argument of type 'IMutableProperty' could be found (are you missing a using directive or an assembly reference?)
。有人知道我错过了什么吗?以上是关于Entity Framework Core - 将小数精度和小数位数设置为所有小数属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Entity Framework Core 将文件存储在数据库中
Entity Framework Core:如何将 2 个 COUNT 查询合并为一个