C# 如何在实体框架代码优先迁移中设置十进制精度和比例

C# 如何在实体框架代码优先迁移中设置十进制精度和比例,c#,entity-framework,entity-framework-migrations,C#,Entity Framework,Entity Framework Migrations,我正在使用实体框架迁移,需要设置实体中十进制属性的精度和比例。我只想对这个十进制属性执行此操作,而不是对所有十进制属性执行此操作。我已经重写了OnModelCreating方法,默认情况下将decimal设置为(18,2)。我需要这一个属性是(22,5)。那么比如说, public class AdditionalCharge { public decimal? Rate { get; set; } } 在数据库中创建为“decimal(18,2)NULL”列。我需要它变成一个“十进制(2

我正在使用实体框架迁移,需要设置实体中十进制属性的精度和比例。我只想对这个十进制属性执行此操作,而不是对所有十进制属性执行此操作。我已经重写了OnModelCreating方法,默认情况下将decimal设置为(18,2)。我需要这一个属性是(22,5)。那么比如说,

public class AdditionalCharge
{
  public decimal? Rate { get; set; }
}
在数据库中创建为“decimal(18,2)NULL”列。我需要它变成一个“十进制(22,5)空”列

我可以创建一个空迁移并手工编写更改代码

public override void Up()
{
  AlterColumn("dbo.AdditionalCharge", "Rate", c => c.Decimal(nullable: true, precision: 22, scale: 5));
}
但我宁愿更改C#声明,让迁移来创建更改

有办法吗


Mike

您也可以在ModelCreating中设置列的精度:

modelBuilder.Entity<AdditionalCharge>().Property(o => o.Rate ).HasPrecision(22, 5);
modelBuilder.Entity().Property(o=>o.Rate).HasPrecision(22,5);

但我不知道在迁移过程中是否会收到更改。

@DStanley不能100%确定这是一个骗局,因为OP要求的是一些稍微不同的东西。在这种情况下,可能是不可能的,或者用特定的
TypeName
@DavidG I添加
Column
属性可能是错误的,但它看起来像
modelBuilder.Entity().Property(o=>o.Rate).HasPrecision(22,5)应设置精度。迁移工具是否会改变精度还不清楚,所以我同意重新打开它。@DStanley是的,我对这一点也有两个想法。我要去玩了…谢谢,但这并不能解决我的问题。如果我正在创建表,那就可以了,但是我有一个包含数据的现有表,而且我的站点正在生产中,所以我不能在此时对表/数据库进行重击,从零开始。我必须处理存在的实体/表格。除了OP提供的“新”信息外,这确实有效,因此我会投票。有趣的是,如果您还尝试使用
并指定一个
类型名
十进制(22,5)
,那么迁移将完全中断,看起来像是EF的一个bug。@MikeLockhart我没有说你应该从头开始-我希望迁移过程能够识别更改,只是更改列的类型(而不是删除/重新创建)。如果您添加,我无法说明此更改的迁移SQL是什么样子的,因此如果它不能解决您的问题,我很抱歉。但是,将精度从18更改为22将导致列大小增加,因此可能无法就地更改大小。这意味着您可能必须创建一个新列,移动数据,并重命名它,删除旧列,迁移工具可能无法做到这一点。@DStanley这不是问题,只是指出代码片段只能通过OnModelCreating运行。我只是手工编写了迁移代码,效果很好。我希望能找到一种方法,在属性声明中添加一个装饰或类似的东西,让它改变现有的列精度和比例。我在网上找不到任何说我能做到的东西。