【发布时间】: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