【问题标题】:How to set decimal precision and scale in entity framework code first migrations如何在实体框架代码首次迁移中设置小数精度和比例
【发布时间】:2015-08-01 18:49:42
【问题描述】:

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

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

在数据库中创建为“十进制 (18,2) NULL”列。我需要它成为“十进制 (22,5) NULL”列。

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

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

但我宁愿只更改 C# 声明并让迁移创建更改。

有没有办法做到这一点?

迈克

【问题讨论】:

  • @DStanley 不是 100% 确定这是一个骗局,因为 OP 要求的东西略有不同。在这种情况下,可能无法使用特定的TypeName 添加Column 属性。
  • @DavidG 我可能是错的,但似乎modelBuilder.Entity<AdditionalCharge>().Property(o => o.Rate ).HasPrecision(22, 5); 应该设置精度。迁移工具是否会改变只是精度未知,所以我同意重新打开它。
  • @DStanley 是的,我对这个也有两种想法。我要去玩了……

标签: c# entity-framework entity-framework-migrations


【解决方案1】:

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

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

但我不知道迁移中是否会接受更改。

【讨论】:

  • 谢谢,但这并不能解决我的问题。如果我正在创建表,那会很好,但是我有一个包含数据的现有表,并且我的网站正在生产中,所以我现在无法修改表/数据库并从头开始。我必须处理存在的实体/表。
  • 除了来自 OP 的“新”信息之外,这确实有效,所以得到了我的投票。有趣的是,如果您还尝试使用 Column 并指定 TypeNameDECIMAL(22, 5),则迁移完全中断,看起来像 EF 的错误。
  • @MikeLockhart 我没有说您应该从头开始 - 我希望迁移过程能够识别更改并仅更改列的类型(而不是删除/重新创建它)。如果您添加,我无法说明迁移 SQL 会如何进行此更改,所以如果它不能解决您的问题,我很抱歉。
  • 将精度从 18 更改为 22 会导致列大小增加,因此可能无法就地更改大小。这意味着您可能必须创建一个新列,移动数据并重命名它,删除旧列,迁移工具可能无法干净地做到这一点..
  • @DStanley 没问题,只是指出代码 sn-p 只能由 OnModelCreating 运行。我只是手动编写了迁移代码,它运行良好。我希望找到一种方法来为属性声明或类似的东西添加装饰,并让它改变现有的列精度和比例。我无法在网上找到任何东西说我可以做到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2013-09-16
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多