【问题标题】:EF migration - default value for stringEF 迁移 - 字符串的默认值
【发布时间】:2018-03-04 06:41:26
【问题描述】:

我正在尝试使用 EF 迁移(代码优先)更新数据库。我想添加一个新的字符串列,它应该包含一个默认值,所以我像这样创建迁移:

public override void Up()
{
    AddColumn("dbo.SupplierCodeMappings", "SupplierCompanyCode", 
                  c => c.String(defaultValueSql:"'X'"));
}

我从中生成了一个脚本,我认为这看起来也不错。

ALTER TABLE [dbo].[SupplierCodeMappings] ADD [SupplierCompanyCode] [nvarchar](max) DEFAULT 'X'
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])
VALUES (N'201709221530217_AddSupplierMappingCompanyCode', N'Ea.Data.Database.EaContext', xxxxxx , N'6.1.3-40302')

但是,当我对数据库运行它时,新列的所有行都有NULL 值。 (我还在迁移中尝试了带有defaultValue:"X" 的变体,但没有成功)。

我之前多次使用不同类型(int、DateTime)的默认值,并且每次都有效,字符串是否有一些特殊行为?

【问题讨论】:

  • 可能是默认值未插入,因为该列可以为空,但这将是一种奇怪的行为。当您使列不可为空(.IsRequired,[Required])时它是否有效?
  • 好主意,我已将 nullable: false 添加到迁移中,它可以工作。但是,我相信无论如何它应该能够填充一些值,这对我来说听起来有点像一些错误。
  • 我猜这取决于你的观点。我会说默认值应该是 when 否则会有空值。但是,您也可以争辩说,对于可为空的列,null 是一个有效值。在 SQL 标准中,如果没有指定其他值,则使用默认值;对于迁移,看起来 null 值已经足够具体了。

标签: c# sql-server entity-framework database-migration


【解决方案1】:

正如 DevilSuichiro 在 cmets 中建议的那样,填充默认值仅在字段/列不可为空时起作用。我不知道这是否是计划中的行为,但现在看来它在 EF/SQL 中以这种方式工作。

所以这按预期工作:

AddColumn("dbo.SupplierCodeMappings", "SupplierCompanyCode", 
              c => c.String(nullable: false, defaultValueSql:"'X'"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 2016-10-06
    • 2023-03-12
    • 2021-10-08
    • 2023-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多