新しいブール列をドロップしたい既存のテーブル/モデルがあります。このテーブルにはすでに数百行のデータがあり、既存のデータに触れることはできません。しかし..この列はNULLに対応しないため、現在存在するすべての行にtrue
のデフォルト値を提供する必要があります。
public class Revision
{
...
public Boolean IsReleased { get; set; }
....
}
重要:
(これはOPにありましたが、人々は見逃していたようです。)
移行によってデータベースが更新される場合、この新しい列を受け取る既存の行はすべて、値をTrueに設定する必要があります。
もう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));
フィールドの使用を避け、C#6の新機能である 自動プロパティ初期化 を利用できます。
これにより、この列がデータベースに追加されるときにデフォルト値がtrue
に設定されます。
public class Revision
{
...
public Boolean IsReleased { get; set; } = true;
....
}
@ BrewMate の comment を含めるように編集します:
データベースの更新時にすべての値がfalseに設定されている場合は、JSONフォーマッターがデフォルト値を処理するようにしてください。 JSONフォーマッターはデフォルトでデフォルト値を無視し、データベースはブール値をデフォルト値
false
に設定します。以下のリンクを参照して、列挙としてデフォルトを試してみます: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm
[〜#〜] 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」を追加する必要があります。
残念ながら、私はC#のバージョンで@Brandon Minnickの提案を使用することができませんでした。他の提案は、多くの仕事のように思えましたが、代わりに私はこれを行うことになりました: https://stackoverflow.com/a/46436861/18194
オブジェクトを初期化するときに、単純に自動実装プロパティを回避し、プロパティ値をtrue
に設定することができます。
private Boolean _isReleased = true;
public Boolean IsReleased
{
get
{
return _isReleased;
}
set
{
_isReleased = value;
}
}