Définition de la valeur par défaut d'une propriété DateTime sur DateTime.Now dans la valeur par défaut System.ComponentModel Attrbute

asp.net asp.net-core-2.1 c# ef-core-2.1 entity-framework

Question

Est-ce que quelqu'un sait comment je peux spécifier la valeur par défaut d'une propriété DateTime à l'aide de l'attribut System.ComponentModel DefaultValue?

par exemple j'essaye ceci:

[DefaultValue(typeof(DateTime),DateTime.Now.ToString("yyyy-MM-dd"))]
public DateTime DateCreated { get; set; }

Et il s'attend à ce que la valeur soit une expression constante.

Ceci est dans le contexte d'utilisation avec ASP.NET Dynamic Data. Je ne veux pas échafauder la colonne DateCreated mais simplement fournir le DateTime.Now s'il n'est pas présent. J'utilise Entity Framework comme couche de données

À votre santé,

Andrew

Réponse acceptée

Vous ne pouvez pas faire cela avec un attribut car ce ne sont que des méta-informations générées au moment de la compilation. Ajoutez simplement du code au constructeur pour initialiser la date si nécessaire, créez un déclencheur et gérez les valeurs manquantes dans la base de données ou implémentez le getter de manière à ce qu'il retourne DateTime.Now si le champ de sauvegarde n'est pas initialisé.

public DateTime DateCreated
{
   get
   {
      return this.dateCreated.HasValue
         ? this.dateCreated.Value
         : DateTime.Now;
   }

   set { this.dateCreated = value; }
}

private DateTime? dateCreated = null;

Réponse populaire

Je n'ai aucune raison de penser que cela ne devrait pas être possible avec un attribut. C'est peut-être dans le backlog de Microsoft. Qui sait.

La meilleure solution que j'ai trouvée consiste à utiliser le paramètre defaultValueSql dans la première migration du code.

CreateTable(
    "dbo.SomeTable",
    c => new
        {
            TheDateField = c.DateTime(defaultValueSql: "GETDATE()")
        });

Je n'aime pas la solution souvent référencée consistant à le définir dans le constructeur de la classe d'entité, car si un élément autre que Entity Framework conserve un enregistrement dans cette table, le champ de date ne recevra pas de valeur par défaut. Et l'idée d'utiliser un déclencheur pour gérer ce cas me semble tout simplement fausse.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow