Quelqu'un sait-il comment je peux spécifier la valeur par défaut pour 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.
C'est dans le contexte de l'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
la source
get
partie peut être simplifiée à:return dateCreated ?? DateTime.Now;
Ajouter ci-dessous à la propriété DateTime
la source
Il n'y a aucune raison que je puisse trouver que cela ne devrait pas être possible à travers un attribut. C'est peut-être dans l'arriéré de Microsoft. Qui sait.
La meilleure solution que j'ai trouvée est d'utiliser le paramètre defaultValueSql dans la première migration du code.
Je n'aime pas la solution souvent de référence consistant à le définir dans le constructeur de la classe d'entité, car si autre chose que Entity Framework colle un enregistrement dans cette table, le champ de date n'obtiendra pas de valeur par défaut. Et l'idée d'utiliser un déclencheur pour gérer ce cas me semble tout simplement erronée.
la source
J'ai testé cela sur EF core 2.1
Ici, vous ne pouvez utiliser ni les conventions ni les annotations de données. Vous devez utiliser l' API Fluent .
Doc officiel
la source
C'est possible et assez simple:
pour
DateTime.MinValue
pour toute autre valeur en tant que dernier argument de la
DefaultValueAttribute
chaîne de spécification qui représente la valeur DateTime souhaitée.Cette valeur doit être une expression constante et est requise pour créer object (
DateTime
) en utilisantTypeConverter
.la source
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)
Une solution simple si vous utilisez Entity Framework est d'ajouter une classe partielle et de définir un constructeur pour l'entité car le framework n'en définit pas un. Par exemple, si vous avez une entité nommée Example, vous placez le code suivant dans un fichier séparé.
la source
Je pense que la solution la plus simple est de définir
dans la déclaration de colonne et dans le concepteur EntityModel VS2010, définissez la propriété de colonne correspondante StoreGeneratedPattern = Computed .
la source
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.
Sans l'attribut DefaultValue, le sérialiseur JSON afficherait "1/1/0001 12:00:00 AM" même si l'option DefaultValueHandling.Ignore a été définie.
la source
Pensez simplement à définir sa valeur dans le constructeur de votre classe d'entité
la source
Datetime
propriété nullable avant de faire cela.J'avais besoin d'un horodatage UTC comme valeur par défaut et j'ai donc modifié la solution de Daniel comme ceci:
Pour le didacticiel DateRangeAttribute, consultez cet article de blog génial
la source
using System.ComponentModel.DataAnnotations.Schema;
la source
Il y a un moyen. Ajoutez ces classes:
DefaultDateTimeValueAttribute.cs
DefaultDateTimeExtensions.cs
Et utilisez DefaultDateTimeValue comme attribut de vos propriétés. Les valeurs à saisir dans votre attribut de validation sont des éléments tels que "Now", qui sera rendu au moment de l'exécution à partir d'une instance DateTime créée avec un activateur. Le code source est inspiré de ce fil: https://code.msdn.microsoft.com/A-flexible-Default-Value-11c2db19 . Je l'ai changé pour que ma classe hérite avec DefaultValueAttribute au lieu d'un ValidationAttribute.
la source
J'ai rencontré le même problème, mais celui qui fonctionne le mieux pour moi est ci-dessous:
la source
Je viens de trouver ceci à la recherche de quelque chose de différent, mais dans la nouvelle version C #, vous pouvez utiliser une version encore plus courte pour cela:
la source
la source
La façon dont vous gérez cela pour le moment dépend du modèle que vous utilisez Linq to SQL ou EntityFramework?
Dans L2S, vous pouvez ajouter
EF est un peu plus compliqué, voir http://msdn.microsoft.com/en-us/library/cc716714.aspx pour plus d'informations sur la logique d'entreprise EF.
la source
Je sais que cet article est un peu vieux, mais j'ai une suggestion qui pourrait aider certains.
J'ai utilisé un Enum pour déterminer ce qu'il faut définir dans le constructeur d'attributs.
Déclaration de propriété:
Constructeur de propriété:
Énumération:
la source
Je pense que vous pouvez le faire en utilisant
StoreGeneratedPattern = Identity
(défini dans la fenêtre des propriétés du concepteur de modèle).Je n'aurais pas deviné que ce serait comment le faire, mais en essayant de le comprendre, j'ai remarqué que certaines de mes colonnes de dates étaient déjà par défaut
CURRENT_TIMESTAMP()
et d'autres pas. En vérifiant le modèle, je vois que la seule différence entre les deux colonnes en plus du nom est que celle qui obtient la valeur par défaut estStoreGeneratedPattern
définie surIdentity
.Je ne m'attendais pas à ce que ce soit le cas, mais en lisant la description, cela a du sens:
De plus, bien que cela donne à la colonne de base de données une valeur par défaut "maintenant", je suppose que cela ne définit pas réellement la propriété comme étant
DateTime.Now
dans le POCO. Cela n'a pas été un problème pour moi car j'ai un fichier .tt personnalisé qui définit déjà toutes mes colonnes de dateDateTime.Now
automatiquement (il n'est en fait pas difficile de modifier le fichier .tt vous-même, surtout si vous avez ReSharper et obtenez une coloration syntaxique (Les versions plus récentes de VS peuvent déjà mettre en évidence les fichiers .tt, pas sûr.))Le problème pour moi était le suivant: comment faire pour que la colonne de base de données ait une valeur par défaut afin que les requêtes existantes qui omettent cette colonne fonctionnent toujours? Et le paramètre ci-dessus a fonctionné pour cela.
Je ne l'ai pas encore testé, mais il est également possible que la définition de cela interfère avec la définition de votre propre valeur explicite. (Je suis seulement tombé sur cela en premier lieu parce que EF6 Database First a écrit le modèle pour moi de cette façon.)
la source
Dans la version C # 6, il est possible de fournir une valeur par défaut
la source
Avec EF 7:
script de migration:
résultat:
la source
Je voulais aussi cela et j'ai trouvé cette solution (j'utilise uniquement la partie date - une heure par défaut n'a aucun sens comme valeur par défaut de PropertyGrid):
Cela crée simplement un nouvel attribut que vous pouvez ajouter à votre propriété DateTime. Par exemple, si la valeur par défaut est DateTime.Now.Date:
la source