271 votes

Entity Framework 6 Code first Valeur par défaut

Y a-t-il un moyen "élégant" de donner une valeur par défaut à une propriété spécifique ?

Peut-être par DataAnnotations, quelque chose comme :

[DefaultValue("true")]
public bool Active { get; set; }

Merci.

10voto

Anthony Griggs Points 72

Je reconnais que mon approche échappe complètement au concept "Code First". Mais si vous avez la capacité de simplement changer la valeur par défaut dans la table elle-même... c'est beaucoup plus simple que les étapes que vous devez suivre ci-dessus... Je suis juste trop paresseux pour faire tout ce travail!

Il semble presque que l'idée originale des affiches fonctionnerait:

[DefaultValue(true)]
public bool IsAdmin { get; set; }

Je pensais qu'ils avaient simplement fait l'erreur d'ajouter des guillemets... mais malheureusement pas une telle intuitivité. Les autres suggestions étaient juste trop pour moi (bien sûr, j'ai les privilèges nécessaires pour aller dans la table et faire les changements... où tous les développeurs ne le feront pas dans toutes les situations). À la fin, je l'ai simplement fait à l'ancienne. J'ai défini la valeur par défaut dans la table SQL Server... je veux dire, assez! NOTE : J'ai ensuite testé en ajoutant une migration et en mettant à jour la base de données et les changements sont restés. entrer la description de l'image ici

9voto

Roar Jørstad Points 11

Dans .NET Core 3.1, vous pouvez faire ce qui suit dans la classe modèle :

    public bool? Active { get; set; } 

Dans le DbContext OnModelCreating, vous ajoutez la valeur par défaut.

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .Property(b => b.Active)
            .HasDefaultValueSql("1");

        base.OnModelCreating(modelBuilder);
    }

Résultant en ce qui suit dans la base de données

entrer la description de l'image ici

Remarque : Si vous n'avez pas de valeur nullable (bool?) pour votre propriété, vous obtiendrez l'avertissement suivant

La propriété 'bool' 'Active' sur le type d'entité 'Foundation' est configurée avec une valeur par défaut générée par la base de données. Cette valeur par défaut sera toujours utilisée pour les insertions lorsque la propriété a la valeur 'false', car c'est la valeur par défaut CLR pour le type 'bool'. Envisagez d'utiliser le type 'bool?' nullable à la place afin que la valeur par défaut ne soit utilisée que pour les insertions lorsque la valeur de la propriété est 'null'.

9voto

Denny Puig Points 129

Après le commentaire de @SedatKapanoglu, j'ajoute toute mon approche qui fonctionne, car il avait raison, utiliser uniquement l'API fluide ne fonctionne pas.

1- Créer un générateur de code personnalisé et remplacer la méthode Generate pour un ColumnModel.

   public class ExtendedMigrationCodeGenerator : CSharpMigrationCodeGenerator
{

    protected override void Generate(ColumnModel column, IndentedTextWriter writer, bool emitName = false)
    {

        if (column.Annotations.Keys.Contains("Default"))
        {
            var value = Convert.ChangeType(column.Annotations["Default"].NewValue, column.ClrDefaultValue.GetType());
            column.DefaultValue = value;
        }

        base.Generate(column, writer, emitName);
    }

}

2- Assigner le nouveau générateur de code :

public sealed class Configuration : DbMigrationsConfiguration
{
    public Configuration()
    {
        CodeGenerator = new ExtendedMigrationCodeGenerator();
        AutomaticMigrationsEnabled = false;
    }
}

3- Utiliser l'API fluide pour créer l'Annotation :

public static void Configure(DbModelBuilder builder){    
builder.Entity().Property(c => c.Status).HasColumnAnnotation("Default", 0);            
}

6voto

C'est simple! Il suffit d'annoter avec [Requis].

[Requis]
public bool MonChamp { get; set; }

la migration résultante sera:

migrationBuilder.AddColumn(
name: "MyField",
table: "MyTable",
nullable: false,
defaultValue: false);

Si vous voulez true, changez la defaultValue à true dans la migration avant de mettre à jour la base de données

4voto

Velio Points 91

J'ai trouvé que simplement utiliser l'initialiseur de propriété automatique sur la propriété de l'entité est suffisant pour faire le travail.

Par exemple:

public class Thing {
    public bool IsBigThing{ get; set; } = false;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X