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&lt;MyEntity&gt;(c =&gt; 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 =&gt; p.ClrType == typeof(decimal) || p.ClrType == typeof(decimal?)) 匹配这两种类型 有没有办法以强类型的方式设置精度?有没有HasPrecisionfluent 方法? @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 查询合并为一个

Entity Framework Core 性能优化

Entity Framework Core 性能优化

Entity Framework Core - 将小数精度和小数位数设置为所有小数属性[重复]

将内联表值函数与 Linq 和 Entity Framework Core 一起使用