2017-09-22 16 views
0

EFの移行(コードファースト)を使用してDBを更新しようとしています。私は、デフォルト値が含まれている必要があり、新しい文字列列を追加したいので、私はこのような移行を作成:EFの移行 - 文字列のデフォルト値

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

私は私の意見でもOKに見えた、それから、スクリプトを生成します。私はDBに対してそれを実行したときに

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)で何度もデフォルト値を使用していましたが、毎回機能しました。文字列に対して特別な動作がいくつかありますか?

+1

は、デフォルト値が挿入されていないかもしれないが、しかしそれは奇妙な行動になります。カラムをnullにできないようにするときに機能しますか(.IsRequired、[必須])? – DevilSuichiro

+0

いいえ、マイグレーションに 'nullable:false'を追加しました。しかし、私はそれがとにかくいくつかの値を埋めることができると信じて、それは私にいくつかのバグのように少し聞こえる。 –

+0

あなたの視点によると思います。私は、デフォルト値はそうでなければnullがあるはずだと言います。ただし、NULL可能な列の場合、nullは有効な値であると主張することもできます。 SQL標準では、他の値が指定されていない場合はデフォルト値が使用されます。マイグレーションの場合、値nullは十分に具体的です。 – DevilSuichiro

答えて

0

DevilSuichiroがコメントで示唆しているように、デフォルトの値を書き込むことは、フィールド/カラムがnull値ではない場合にのみ機能します。私はそれが計画された動作であるかどうかはわかりませんが、EF/SQLではこれが今のように動作するように見えます。

期待通りだから、これは動作します:列がNULL可能であるため、

AddColumn("dbo.SupplierCodeMappings", "SupplierCompanyCode", 
       c => c.String(nullable: false, defaultValueSql:"'X'")); 
関連する問題