2017-04-07 91 views
5

我想将所有小数位数的精度设置为(18,6)。在EF6这很容易:实体框架核心 - 将小数精度和小数位数设置为所有小数属性

modelBuilder.Properties<decimal>().Configure(x => x.HasPrecision(18, 6)); 

但我似乎无法在EF核心中找到类似的东西。删除级联删除惯例并不在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? 
     } 

我想如果我在右边t机架以及如何继续,否则,我应该开始在所有的decimal属性上放置数据注释。

+0

有一个非常粗暴的方法,但不知道是否有更优雅和灵活的方法。你可以使用'modelBuilder.Entity (c => c.HasColumn(“DECIMAL(10,6”))'来指定列的类型,但它可能会将你与特定类型的DB结合起来,因为类型是具体的数据库 – Tseng

+0

这种方式,我必须列出'OnModelCreating'方法中的所有小数属性,这与向所有这些方法添加DataAnnotations没什么不同,我试图避免的东西:) – GregoryHouseMD

+0

因为我必须继续前进开发,我手动设置了所有198个十进制属性(希望我没有错过任何),但是如果有人想到我怎么可以循环遍历所有这些,请让我知道 – GregoryHouseMD

回答

10

您靠近了。这是代码。

foreach (var property in modelBuilder.Model.GetEntityTypes() 
    .SelectMany(t => t.GetProperties()) 
    .Where(p => p.ClrType == typeof(decimal))) 
{ 
    property.Relational().ColumnType = "decimal(18, 6)"; 
} 
+1

3小时前,当我开始输入200属性? :D – GregoryHouseMD

+0

@GregoryHouseMD如果你做了一些搜索,但你可以找到重复的:) –

+0

我做过,也评论过一个类似的Q,但没有偶然发现重复。这个答案和重复答案之间有任何性能差异吗? – GregoryHouseMD