web-dev-qa-db-ja.com

Code Firstモデルのブール値にデフォルト値を設定する方法は?

新しいブール列をドロップしたい既存のテーブル/モデルがあります。このテーブルにはすでに数百行のデータがあり、既存のデータに触れることはできません。しかし..この列はNULLに対応しないため、現在存在するすべての行にtrueのデフォルト値を提供する必要があります。

public class Revision
{
    ...
    public Boolean IsReleased { get; set; }
    ....
}

重要:

(これはOPにありましたが、人々は見逃していたようです。)

移行によってデータベースが更新される場合、この新しい列を受け取る既存の行はすべて、値をTrueに設定する必要があります。

17
Casey Crookston

もう1つのオプションは、デフォルトコンストラクターを作成し、必要なデフォルト値でプロパティを設定することです。

public class Revision
{
    public Boolean IsReleased { get; set; }

    public Revision()
    {
        IsReleased=true;

    }
}

Update-Databaseコマンドを実行するときに既存の行のtrueに値を設定するには、Configurationクラスでこれを行うことができます。

protected override void Seed(YourContext context)
{
    var entities=context.Revisions.Where(r=>!r.IsReleased)
    foreach(var e in entities)
    {
      e.IsReleased=true;
     //context.Entry(e).State = EntityState.Modified; If you have disabled change tracking then add this line
    }
    context.SaveChanges();
}

更新

移行を介して追加する新しい列の場合は、これを行うこともできます。

AddColumn("dbo.Revisions", "IsReleased", c => c.Boolean(nullable: false, defaultValue: true));
26
octavioccl

フィールドの使用を避け、C#6の新機能である 自動プロパティ初期化 を利用できます。

これにより、この列がデータベースに追加されるときにデフォルト値がtrueに設定されます。

public class Revision
{
    ...
    public Boolean IsReleased { get; set; } = true;
    ....
}

@ BrewMatecomment を含めるように編集します:

データベースの更新時にすべての値がfalseに設定されている場合は、JSONフォーマッターがデフォルト値を処理するようにしてください。 JSONフォーマッターはデフォルトでデフォルト値を無視し、データベースはブール値をデフォルト値falseに設定します。以下のリンクを参照して、列挙としてデフォルトを試してみます: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm

17
Brandon Minnick

[〜#〜] msdn [〜#〜] に従って、DefaultValueAttributeはプロパティのデフォルト値を指定します。 DefaultValueAttributeを次のように使用できます。

public class Revision
{
    ...
    [DefaultValue(true)]
    public Boolean IsReleased { get; set; } = true;
    ....
}

さらに、DbMigrationクラス内で次のようにUP()メソッドを使用できます。

public partial class InitializeDb : DbMigration
{
    public override void Up()
    {
            CreateTable(
            "dbo.Revision",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ...
                    IsReleased = c.Boolean(nullable: false, defaultValue: true),
                    ...
                })
            .PrimaryKey(t => t.Id);
    }
}

自分で「defaultValue:true」を追加する必要があります。

3
Varan Sinayee

残念ながら、私はC#のバージョンで@Brandon Minnickの提案を使用することができませんでした。他の提案は、多くの仕事のように思えましたが、代わりに私はこれを行うことになりました: https://stackoverflow.com/a/46436861/18194

1
Anthony Griggs

オブジェクトを初期化するときに、単純に自動実装プロパティを回避し、プロパティ値をtrueに設定することができます。

private Boolean _isReleased = true;
public Boolean IsReleased 
{ 
    get
    {
        return _isReleased;
    }
    set
    {
        _isReleased = value;
    }
}
0
Alex