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.

3voto

dE Source Points 95

Dans EF core publié le 27 juin 2016, vous pouvez utiliser l'API fluide pour définir une valeur par défaut. Allez dans la classe ApplicationDbContext, trouvez/créez la méthode nommée OnModelCreating et ajoutez l'API fluide suivante.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
        .Property(b => b.Actif)
        .HasDefaultValue(true);
}

2voto

en utilisant System.ComponentModel;

[DefaultValue(true)]

public bool Actif { get; set; }

2voto

Manos Pasgiannis Points 1304

Si vous utilisez Entity Framework Core et que vous souhaitez utiliser des Annotations de données au lieu de Fluent API, vous devrez créer un attribut personnalisé ainsi qu'une convention personnalisée.

SqlDefaultValueAttribute.cs

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SqlDefaultValueAttribute : Attribute
{
    public SqlDefaultValueAttribute(string defaultValue)
    {
        DefaultValue = defaultValue;
    }

    public string DefaultValue { get; set; }
}

SqlDefaultValueConvention.cs

public class SqlDefaultValueConvention
    : PropertyAttributeConventionBase
{
    public SqlDefaultValueConvention(ProviderConventionSetBuilderDependencies dependencies)
        : base(dependencies) { }

    protected override void ProcessPropertyAdded(
        IConventionPropertyBuilder propertyBuilder,
        SqlDefaultValueAttribute attribute,
        MemberInfo clrMember,
        IConventionContext context)
    {
        propertyBuilder.HasDefaultValueSql(attribute.DefaultValue);
    }
}

Vous devrez ensuite enregistrer la convention dans votre DbContext

public class ApplicationDbContext : DbContext
{
    protected override void ConfigureConventions(
        ModelConfigurationBuilder configurationBuilder)
    {
        configurationBuilder.Conventions.Add(services =>
            new SqlDefaultValueConvention(
                services.GetRequiredService()));
    }
}

Vous pouvez maintenant l'utiliser de cette manière:

public class MyEntity
{
    [SqlDefaultValue("getdate()")]
    public DateTime CreatedAt { get; set; }
}

0voto

Bappa Malakar Points 9

Surchargez simplement le constructeur par défaut de la classe Model et passez tout paramètre pertinent que vous pouvez utiliser ou non. De cette façon, vous pouvez facilement fournir des valeurs par défaut pour les attributs. Voici un exemple.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Aim.Data.Domain
{
    [MetadataType(typeof(LoginModel))]
    public partial class Login
    {       
        public Login(bool status)
        {
            this.CreatedDate = DateTime.Now;
            this.ModifiedDate = DateTime.Now;
            this.Culture = "EN-US";
            this.IsDefaultPassword = status;
            this.IsActive = status;
            this.LoginLogs = new HashSet();
            this.LoginLogHistories = new HashSet();
        }

    }

    public class LoginModel
    {

        [Key]
        [ScaffoldColumn(false)] 
        public int Id { get; set; }
        [Required]
        public string LoginCode { get; set; }
        [Required]
        public string Password { get; set; }
        public string LastPassword { get; set; }     
        public int UserGroupId { get; set; }
        public int FalseAttempt { get; set; }
        public bool IsLocked { get; set; }
        public int CreatedBy { get; set; }       
        public System.DateTime CreatedDate { get; set; }
        public Nullable ModifiedBy { get; set; }      
        public Nullable ModifiedDate { get; set; }       
        public string Culture { get; set; }        
        public virtual ICollection LoginLogs { get; set; }
        public virtual ICollection LoginLogHistories { get; set; }
    }

}

-1voto

Même à partir de .NET Core 1.0, il est possible de définir des valeurs par défaut lorsque vous utilisez l'approche code first. Voir l'extrait de code suivant.

using System.ComponentModel;

private bool _myVal = false;

[DefaultValue(true)]
public bool Active
{
    get
    {
        return _myVal;
    }
    set
    {
        _myVal = value;
    }
}

Lire pour plus d'informations : Docs officiels de Microsoft

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