Ich habe eine Tabelle/ein Modell, in das ich eine neue boolesche Spalte einfügen möchte. Diese Tabelle enthält bereits viele hundert Datenzeilen, und ich kann die vorhandenen Daten nicht berühren. Aber .. Diese Spalte kann NICHT mit Nullen versehen werden, daher muss für alle derzeit vorhandenen Zeilen ein Standardwert von true
angegeben werden.
public class Revision
{
...
public Boolean IsReleased { get; set; }
....
}
WICHTIG:
(Das war im OP, aber die Leute schienen es zu vermissen.)
Wenn Datenbanken mit der Migration aktualisiert werden, MÜSSEN die Werte aller vorhandenen Zeilen, die diese neue Spalte erhalten, auf True gesetzt werden.
Eine weitere Option ist das Erstellen eines Standardkonstruktors und das Festlegen der Eigenschaften mit den erforderlichen Standardwerten:
public class Revision
{
public Boolean IsReleased { get; set; }
public Revision()
{
IsReleased=true;
}
}
Um die Werte auf true
der vorhandenen Zeilen festzulegen, wenn Sie den Befehl Update-Database
ausführen, können Sie dies in Ihrer Configuration
-Klasse tun:
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();
}
Wenn es sich um eine neue Spalte handelt, die Sie über die Migration hinzufügen, können Sie dies möglicherweise auch tun:
AddColumn("dbo.Revisions", "IsReleased", c => c.Boolean(nullable: false, defaultValue: true));
Sie können die Verwendung von Feldern vermeiden und die Auto-Eigenschaftsinitialisierung nutzen, eine in C # 6 neue Funktion.
Dies ist der Standardwert auf true
, wenn diese Spalte Ihrer Datenbank hinzugefügt wird.
public class Revision
{
...
public Boolean IsReleased { get; set; } = true;
....
}
Bearbeiten Sie den Kommentar von @BrewMate :
Wenn alle Ihre Werte beim Aktualisieren der Datenbank auf "false" gesetzt sind, müssen Sie sicherstellen, dass die Standardwerte für das JSON-Formatierungsprogramm verwendet werden. Das JSON-Formatierungsprogramm ignoriert standardmäßig die Standardwerte. Anschließend setzt Ihre Datenbank den booleschen Wert auf den Standardwert
false
. Siehe den Link unten, ich würde Default als Aufzählung versuchen: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm
Leider war ich nicht in der Version von C #, um den Vorschlag von @Brandon Minnick verwenden zu können, der am einfachsten erscheint. Andere Vorschläge schienen einfach zu viel Arbeit zu sein, stattdessen endete ich damit: https://stackoverflow.com/a/46436861/1819403
Entsprechend dem MSDN gibt DefaultValueAttribute den Standardwert für eine Eigenschaft an. Sie können DefaultValueAttribute als .__ verwenden. folgende:
public class Revision
{
...
[DefaultValue(true)]
public Boolean IsReleased { get; set; } = true;
....
}
Darüber hinaus können Sie die UP () - Methode in der DbMigration-Klasse wie folgt verwenden:
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);
}
}
Sie sollten "defaultValue: true" selbst hinzufügen.
Sie können einfach automatisch implementierte Eigenschaften vermeiden und den Eigenschaftenwert auf true
setzen, wenn Sie Ihr Objekt initialisieren.
private Boolean _isReleased = true;
public Boolean IsReleased
{
get
{
return _isReleased;
}
set
{
_isReleased = value;
}
}