如何在实体框架Code First迁移中设置小数精度和比例

4

我正在使用实体框架迁移,并需要设置实体中十进制属性的精度和比例。 我只想针对此单个十进制属性执行此操作,而不是所有十进制属性。 我已经覆盖了 OnModelCreating 方法,将默认的十进制设置为(18,2)。 我需要此属性为(22,5)。 例如:

public class AdditionalCharge
{
  public decimal? Rate { get; set; }
}

在数据库中,该列被创建为“decimal (18,2) NULL”。我需要将其变成“decimal (22,5) NULL”。

我可以创建一个空迁移并手动编写更改内容,

public override void Up()
{
  AlterColumn("dbo.AdditionalCharge", "Rate", c => c.Decimal(nullable: true, precision: 22, scale: 5));
}

但我更愿意改变C#声明,让迁移创建更改。

有没有办法这样做?

Mike


@DStanley 我不确定这是否是重复问题,因为 OP 正在寻求略有不同的东西。在这种情况下,可能要么不可能,要么就是添加具有特定“TypeName”的“Column”属性。 - DavidG
@DavidG 我可能错了,但是 modelBuilder.Entity<AdditionalCharge>().Property(o => o.Rate ).HasPrecision(22, 5); 看起来应该设置精度。迁移工具是否仅更改精度尚不确定,因此我同意重新打开它。 - D Stanley
@DStanley 是的,我对这个也有两种想法。我要去玩一下... - DavidG
2个回答

6

你也可以在 OnModelCreating 中设置列的精度:

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

但我不知道这个变化是否会在迁移中被捕捉到。


谢谢,但这并没有解决我的问题。如果我要创建表格的话那就没问题了,但是我现在已经有一张带有数据的现有表格,并且我的网站已经在运营中,因此我不能轻易地删除表格或数据库并重新开始。我必须处理已存在的实体/表格。 - Mike Lockhart
1
除了 OP 提供的这些“新”信息外,这确实有效,因此我支持它。有趣的是,如果您还尝试使用 Column 并指定 TypeNameDECIMAL(22, 5),那么迁移将完全中断,看起来像是 EF 的一个错误。 - DavidG
@MikeLockhart 我并没有说你应该从头开始 - 我原以为迁移过程会识别这个更改,只是改变列的类型(而不是删除/重新创建)。如果您添加,我无法确定此更改的迁移 SQL 是什么样子的,所以如果它不能解决您的问题,我很抱歉。 - D Stanley
将精度从18更改为22会导致列大小增加,因此可能无法原地更改大小。这意味着您可能需要创建一个新列,移动数据并重命名它,删除旧列,而迁移工具可能无法干净地完成此操作。 - D Stanley
@DStanley 没问题,只是想指出代码片段只能由 OnModelCreating 运行。我手动编写了迁移并且它运行得很好。我希望找到一种方法,只需添加一个属性声明的修饰符或类似的东西,就可以改变现有列的精度和比例。我在网上没有找到任何关于这方面的信息。 - Mike Lockhart
迁移应该考虑在 OnModelCreating 中的自定义内容 - 我相信它会将“新”模型与当前数据库结构进行比较,并生成必要的代码将当前结构带到新的结构。正如它所说,但是它可能无法非常干净地(如果有的话)处理此特定更改。 - D Stanley

0

我需要做几乎相同的事情。我在数据库中有数据类型为decimal(18,2)。这意味着总共有18个数字,小数点后最多有2个数字。我需要它变成decimal(18,5),并需要进行迁移。为了让Entity Framework 6自动识别,我将我的模型中属性上方的数据注释从[DataType(DataType.Currency)]更改为[Column(TypeName = "decimal(18,5)")],当我执行'add-migration'时,Entity Framework会自动识别并填充我的迁移文件。

在找到解决方法之前,我的模型(ExampleForm.cs)中的旧数据类型:

[DataType(DataType.Currency)]
public decimal LaborCost { get; set; }

在解决问题后,我的模型(ExampleForm.cs)中出现了新的数据类型。
[Column(TypeName = "decimal(18,5)")]
public decimal LaborCost { get; set; }

我正在处理美元数值,但我需要允许输入的某些值处理小数点后超过2位。

因此,为了明确回答问题,在需要更改模型中的每个属性上方,您应该添加

[Column(TypeName = "decimal(22,5)")]

有用的链接: https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.datatype?view=net-7.0 https://learn.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-ver16

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接