Existe-t-il un moyen "élégant" de donner à une propriété spécifique une valeur par défaut?
Peut-être par DataAnnotations, quelque chose comme:
[DefaultValue("true")]
public bool Active { get; set; }
Je vous remercie.
entity-framework
ef-code-first
default-value
marino-krk
la source
la source
this.Active = true;
? Je pense que la valeur DB aura la priorité lors de la récupération, mais attention si nouveau, puis attacher une entité pour une mise à jour sans récupération d'abord, car le suivi des modifications peut voir cela comme si vous vouliez mettre à jour la valeur. Commentaire parce que je n'ai pas utilisé EF depuis longtemps, et j'ai l'impression que c'est une photo dans le noir.public bool Inactive { get; set; }
😉Réponses:
Vous pouvez le faire en modifiant manuellement la première migration du code:
la source
Active
àtrue
lors de la création d' unEvent
objet aussi bien. La valeur par défaut est toujoursfalse
sur une propriété bool non nullable, donc à moins qu'elle ne soit modifiée, c'est ce que le framework d'entité enregistrera dans la base de données. Ou est-ce que je manque quelque chose?Cela fait un moment, mais laisser une note aux autres. J'ai obtenu ce qui est nécessaire avec un attribut et j'ai décoré mes champs de classe de modèle avec cet attribut comme je le souhaite.
Vous avez l'aide de ces 2 articles:
Ce que j'ai fait:
Définir un attribut
Dans le "OnModelCreating" du contexte
Dans le SqlGenerator personnalisé
Ensuite, dans le constructeur de configuration de migration, enregistrez le générateur SQL personnalisé.
la source
[SqlDefaultValue(DefaultValue = "getutcdate()")]
sur chaque entité. 1) Retirez simplementmodelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));
2) AjoutezmodelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
Les réponses ci-dessus ont vraiment aidé, mais n'ont fourni qu'une partie de la solution. Le problème majeur est que dès que vous supprimez l'attribut Valeur par défaut, la contrainte sur la colonne dans la base de données ne sera pas supprimée. La valeur par défaut précédente restera donc toujours dans la base de données.
Voici une solution complète au problème, y compris la suppression des contraintes SQL sur la suppression des attributs. Je réutilise également le natif de .NET Framework
DefaultValue
attribut .Usage
Pour que cela fonctionne, vous devez mettre à jour IdentityModels.cs et Configuration.cs fichiers
Fichier IdentityModels.cs
Ajoutez / mettez à jour cette méthode dans votre
ApplicationDbContext
classeFichier Configuration.cs
Mettez à jour votre
Configuration
constructeur de classe en enregistrant un générateur SQL personnalisé, comme ceci:Ensuite, ajoutez une classe de générateur SQL personnalisée (vous pouvez l'ajouter au fichier Configuration.cs ou à un fichier distinct)
la source
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
attribut? Si oui, pourquoi? Dans mes tests, cela ne semblait avoir aucun effet en le laissant de côté.Vos propriétés de modèle ne doivent pas nécessairement être des «propriétés automatiques» Même si c'est plus facile. Et l'attribut DefaultValue n'est vraiment que des métadonnées informatives. La réponse acceptée ici est une alternative à l'approche constructeur.
contre.
Cela ne fonctionnera que pour les applications créant et consommant des données à l'aide de cette classe spécifique. Habituellement, ce n'est pas un problème si le code d'accès aux données est centralisé. Pour mettre à jour la valeur dans toutes les applications, vous devez configurer la source de données pour définir une valeur par défaut. La réponse de Devi montre comment cela peut être fait en utilisant des migrations, SQL ou la langue parlée par votre source de données.
la source
Ce que j'ai fait, j'ai initialisé des valeurs dans le constructeur de l'entité
Remarque: les attributs DefaultValue ne définissent pas automatiquement les valeurs de vos propriétés, vous devez le faire vous-même
la source
Après le commentaire de @SedatKapanoglu, j'ajoute toute mon approche qui fonctionne, car il avait raison, le simple fait d'utiliser l'API couramment ne fonctionne pas.
1- Créer un générateur de code personnalisé et remplacer Générer pour un ColumnModel.
2- Attribuez le nouveau générateur de code:
3- Utilisez une API fluide pour créer l'annotation:
la source
C'est simple! Annotez simplement avec requis.
la migration qui en résultera sera:
Si vous voulez true, remplacez defaultValue par true dans la migration avant de mettre à jour la base de données
la source
true
?J'avoue que mon approche échappe à tout le concept de "Code First". Mais si vous avez la possibilité de simplement changer la valeur par défaut dans le tableau lui-même ... c'est beaucoup plus simple que les longueurs que vous devez parcourir ci-dessus ... Je suis juste trop paresseux pour faire tout ce travail!
Il semble presque que l'idée originale des affiches fonctionnerait:
Je pensais qu'ils avaient juste fait l'erreur d'ajouter des citations ... mais hélas pas une telle intuition. Les autres suggestions étaient tout simplement trop pour moi (étant donné que j'ai les privilèges nécessaires pour entrer dans le tableau et apporter les modifications ... où tous les développeurs ne le seront pas dans toutes les situations). En fin de compte, je l'ai fait à l'ancienne. J'ai défini la valeur par défaut dans la table SQL Server ... Je veux dire vraiment, déjà assez! REMARQUE: J'ai en outre testé la création d'une base de données d'ajout-migration et de mise à jour et les modifications sont bloquées.
la source
Il suffit de surcharger le constructeur par défaut de la classe Model et de passer tout paramètre pertinent que vous pouvez utiliser ou non. Par cela, vous pouvez facilement fournir des valeurs par défaut pour les attributs. Voici un exemple.
la source
Considérons que vous avez un nom de classe nommé Products et que vous avez un champ IsActive. vous avez juste besoin d'un constructeur create:
Votre valeur par défaut IsActive est alors True!
Edite :
si vous voulez le faire avec SQL, utilisez cette commande:
la source
Dans EF core publié le 27 juin 2016, vous pouvez utiliser l'API couramment pour définir la valeur par défaut. Accédez à la classe ApplicationDbContext, recherchez / créez le nom de la méthode OnModelCreating et ajoutez l'API courante suivante.
la source
Dans .NET Core 3.1, vous pouvez effectuer les opérations suivantes dans la classe de modèle:
Dans le DbContext OnModelCreating, vous ajoutez la valeur par défaut.
Entraînant ce qui suit dans la base de données
Remarque: Si vous n'avez pas de valeur nulle (bool?) Pour votre propriété, vous obtiendrez l'avertissement suivant
la source
J'ai trouvé qu'il suffit d'utiliser Auto-Property Initializer sur la propriété d'entité pour faire le travail.
Par exemple:
la source
Hmm ... Je fais d'abord DB, et dans ce cas, c'est en fait beaucoup plus facile. EF6 non? Ouvrez simplement votre modèle, faites un clic droit sur la colonne pour laquelle vous souhaitez définir une valeur par défaut, choisissez les propriétés et vous verrez un champ "DefaultValue". Remplissez-le et enregistrez. Il configurera le code pour vous.
Votre kilométrage peut d'abord varier sur le code, je n'ai pas travaillé avec cela.
Le problème avec beaucoup d'autres solutions, c'est que même si elles peuvent fonctionner initialement, dès que vous reconstruisez le modèle, il va jeter tout code personnalisé que vous avez inséré dans le fichier généré par la machine.
Cette méthode fonctionne en ajoutant une propriété supplémentaire au fichier edmx:
Et en ajoutant le code nécessaire au constructeur:
la source
Définissez la valeur par défaut de la colonne dans la table dans MSSQL Server et dans l'attribut add de code de classe, comme ceci:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
pour la même propriété.
la source