web-dev-qa-db-fra.com

Comment définir une valeur par défaut sur un booléen dans un modèle Code First?

J'ai un tableau/modèle existant dans lequel je veux déposer une nouvelle colonne booléenne. Cette table contient déjà plusieurs centaines de lignes de données et je ne peux pas toucher aux données existantes. Mais .. Cette colonne ne sera PAS nullable, je dois donc fournir une valeur par défaut de true à toutes les lignes existantes. 

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

IMPORTANT:

(C'était dans le PO, mais les gens semblaient manquer.)

Lorsque les bases de données sont mises à jour avec la migration, les valeurs de toutes les lignes existantes recevant cette nouvelle colonne DOIVENT être définies sur True.

14
Casey Crookston

Une autre option consiste à créer un constructeur par défaut et à définir les propriétés avec les valeurs par défaut dont vous avez besoin:

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

    public Revision()
    {
        IsReleased=true;

    }
}

Pour définir les valeurs sur true des lignes existantes lorsque vous exécutez la commande Update-Database, vous pouvez le faire dans votre classe 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();
}

Mettre à jour

S'il s'agit d'une nouvelle colonne que vous ajoutez via la migration, vous pouvez également le faire:

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

Vous pouvez éviter d'utiliser des champs et tirer parti de Initialisation de propriété automatique , une nouvelle fonctionnalité de C # 6. 

Ceci définira la valeur par défaut sur true lorsque cette colonne est ajoutée à votre base de données. 

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

Modifier pour inclure @BrewMate 's comment

Si toutes vos valeurs sont définies sur False lors de la mise à jour de la base de données, assurez-vous que le formateur JSON gère les valeurs par défaut. Le formateur JSON ignorera les valeurs par défaut par défaut, puis votre base de données définit le booléen sur sa valeur par défaut, false. Voir le lien ci-dessous. Je voudrais essayer Default comme énumération: http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm

14
Brandon Minnick

Malheureusement, je n'étais pas sur la version de C # pour pouvoir utiliser la suggestion de @Brandon Minnick, qui semble la plus simple. D’autres suggestions semblaient plutôt demander beaucoup de travail au lieu de cela, j’ai fini par le faire: https://stackoverflow.com/a/46436861/1819403

1
Anthony Griggs

Selon le MSDN , DefaultValueAttribute spécifie la valeur par défaut d'une propriété. Vous pouvez utiliser DefaultValueAttribute en tant que Suivant:

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

De plus, vous pouvez utiliser la méthode UP () dans la classe DbMigration comme suit:

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

Vous devriez ajouter "defaultValue: true" par vous-même.

1
Varan Sinayee

Vous pouvez simplement éviter les propriétés implémentées automatiquement et définir la valeur de propriété sur true lorsque vous initialisez votre objet.

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