2017-09-22 107 views
0

我試圖使用EF遷移(代碼優先)來更新數據庫。我想添加一個新的字符串列,它包含一個默認值,所以我創建的遷移是這樣的: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') 

然而,當我運行它反對DB,新列有所有行NULL值。 (我也嘗試過在遷移中使用defaultValue:"X"的變體,但沒有成功)。

我以前使用過不同類型(int,DateTime)之前的默認值,它每次都有效,是否有一些特殊的字符串行爲?

+1

可能是默認值不插入,因爲該列是空的,但是這將是一個怪異的行爲。當列不能爲空(.IsRequired,[必需])時它會起作用嗎? – DevilSuichiro

+0

好主意,我向遷移添加了'nullable:false',它可以工作。不過,我認爲它應該能夠填補一些價值,這聽起來有點像我的一些錯誤。 –

+0

取決於你的觀點我猜。我會說默認值應該是,否則會有空。但是,您也可以爭辯說,對於可空列,null是有效值。在SQL標準中,如果沒有指定其他值,則使用默認值;對於遷移,看起來值null是足夠具體的。 – DevilSuichiro

回答

0

正如DevilSuichiro在評論中所建議的那樣,只有當字段/列不可空時,填充默認值才起作用。我不知道它是否是計劃的行爲,但現在看起來它在EF/SQL中的工作方式如此。

所以這按預期工作:

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