116 votes

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

Quelqu'un sait-il comment je peux spécifier la valeur par défaut d'une propriété DateTime en utilisant l'attribut System.ComponentModel DefaultValue ?

Par exemple, j'essaie 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 dans le cadre d'une utilisation avec ASP.NET Dynamic Data. Je ne veux pas échafauder la colonne DateCreated mais simplement fournir DateTime.Now si elle n'est pas présente. J'utilise l'Entity Framework comme couche de données.

A la vôtre,

Andrew

104voto

Daniel Brückner Points 36242

Vous ne pouvez pas le faire avec un attribut car il s'agit simplement de méta-informations générées au moment de la compilation. Il suffit d'ajouter du code au constructeur pour initialiser la date si nécessaire, créer un déclencheur et gérer les valeurs manquantes dans la base de données, ou implémenter le getter de manière à ce qu'il renvoie 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;

2 votes

Merci, avant que tu ne modifies, j'ai fait le chemin inverse et intercepté le passeur. Merci pour votre aide :-)

17 votes

A get peut être simplifiée : return dateCreated ?? DateTime.Now;

1 votes

Cette solution peut poser un problème si vous voulez que vos classes soient des POCO. Dans mon cas, ma classe devrait être aussi claire que la classe POCO pour être transférée via WCF.

14voto

DSW Points 31

C'est possible et assez simple :

pour DateTime.MinValue

[System.ComponentModel.DefaultValue(typeof(DateTime), "")]

pour toute autre valeur comme dernier argument de DefaultValueAttribute spécifier la chaîne qui représente la valeur DateTime souhaitée.

Cette valeur doit être une expression constante et est requise pour créer l'objet ( DateTime ) en utilisant TypeConverter .

1 votes

J'aimerais croire que cet usage a fonctionné pour moi mais malheureusement ce n'est pas le cas. Résultat de la migration ; defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)

1 votes

J'ai essayé de mettre une date de type chaîne ("1/1/20") au lieu d'une chaîne vide et la conversion s'est faite avec succès.

0 votes

Bien sûr, mais ... la question actuelle concerne le réglage de la date actuelle. Ce qui, afaik, doit être fait soit dans l'API Fluent (que je déteste) ou dans la base de données.

6voto

Terence Golla Points 171

Une solution simple si vous utilisez le Framework Entity est d'ajouter une classe particulière et de définir un constructeur pour l'entité car le Framework n'en définit pas. Par exemple, si vous avez une entité nommée Exemple, vous devez placer le code suivant dans un fichier séparé.

namespace EntityExample
{
    public partial class Example : EntityObject
    {
        public Example()
        {
            // Initialize certain default values here.
            this._DateCreated = DateTime.Now;
        }
    }
}

0 votes

Il s'agit de loin de la solution la plus élégante (et probablement aussi la plus intentionnelle) au problème. Mais cela suppose que les gens utilisent EF Code First.

1 votes

C'est comme ça que je fais, jusqu'à ce que je me rende compte que l'ajout d'une propriété complexe à mon entité fait que EF génère un constructeur par défaut, me laissant sans moyen d'écrire le mien...

5voto

Robertas Points 86

Je pense que la solution la plus simple est de définir

Created DATETIME2 NOT NULL DEFAULT GETDATE()

dans la déclaration de colonne et dans le concepteur d'EntityModel de VS2010, définissez la propriété de colonne correspondante. StoreGeneratedPattern = Calculé .

0 votes

Si je procède de cette manière et que je rends la propriété annulable, je reçois une erreur de validation EDMX, car une colonne non annulable est associée à une propriété annulable.

0 votes

Si vous utilisez EDMX, alors vous n'utilisez pas EF Core.

4voto

Erhhung Points 199

La création d'une nouvelle classe d'attributs est une bonne suggestion. Dans mon cas, je voulais spécifier 'default(DateTime)' ou 'DateTime.MinValue' afin que le sérialiseur Newtonsoft.Json ignore les membres DateTime sans valeurs réelles.

[JsonProperty( DefaultValueHandling = DefaultValueHandling.Ignore )]
[DefaultDateTime]
public DateTime EndTime;

public class DefaultDateTimeAttribute : DefaultValueAttribute
{
    public DefaultDateTimeAttribute()
        : base( default( DateTime ) ) { }

    public DefaultDateTimeAttribute( string dateTime )
        : base( DateTime.Parse( dateTime ) ) { }
}

Sans l'attribut DefaultValue, le sérialiseur JSON produirait "1/1/0001 12:00:00 AM" même si l'option DefaultValueHandling.Ignore a été définie.

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