webentwicklung-frage-antwort-db.com.de

Wie kann ich einen Standardwert für ein Boolean in einem Code First-Modell festlegen?

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.

14
Casey Crookston

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();
}

Aktualisieren

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));
22
octavioccl

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

14
Brandon Minnick

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

1
Anthony Griggs

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.

1
Varan Sinayee

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;
    }
}
1
Alex