Comment utiliser la valeur de colonne par défaut de DataBase dans Entity Framework?

J’ai une colonne Date dans la table qui a la valeur par défaut ou une liaison comme getutcdate (). Je veux utiliser ceci dans framework framework. En générant de l’EDM, j’ai pu trouver la propriété “Default Value” au niveau de la colonne mais je pense que c’est pour la valeur codée en dur.

S’il vous plaît laissez-moi savoir comment puis-je utiliser la valeur par défaut spécifiée dans la firebase database.

L’implémentation de l’événement OnCreated pour l’entité est la solution que j’ai trouvée. J’avais une propriété Guid que je voulais être peuplée. Par défaut, il était rempli avec tous les zéros (00000-0000-00000-etc). En ajoutant ce qui suit à ma classe partielle de l’entité, j’ai pu résoudre le problème.

partial void OnCreated() { Guid = Guid.NewGuid(); } 

StoreGeneratedPattern = “Computed” n’est pas la même chose qu’une valeur par défaut, car cette propriété serait mise à jour CHAQUE FOIS avec la valeur par défaut dans la firebase database. Ce qui signifie qu’il est impossible de la mettre à jour manuellement.

Vous pouvez définir StoreGeneratedPattern sur Identity, auquel cas EF lit la valeur renvoyée par la firebase database après l’exécution de l’instruction INSERT. Le problème avec cette approche est que la prochaine fois que le mappage XML est généré, votre modification sera perdue.

Une autre façon de le faire est de définir vous-même la valeur dans votre code sur DateTime.UtcNow. Vous pouvez définir cela dans le constructeur de votre entité (définir un nouveau constructeur si nécessaire) ou le définir dans votre propre gestionnaire d’événements pour l’événement SavingChanges de votre contexte (voir Comment: exécuter une logique métier lors de l’enregistrement des modifications (Entity Framework)). de gérer l’événement SavingChanges).

Un problème avec la définition de StoreGeneratedPattern = “Computed” ou “Identity” est qu’ils ne permettent pas au client de fournir une valeur. En cours d’exécution sur ce problème sur les insertions, mais aussi pour les mises à jour.

Semble qu’une autre option ou deux est nécessaire pour StoreGeneratedPattern afin que la firebase database puisse au moins voir les valeurs fournies par l’utilisateur, mais la remplacer si nécessaire. Cela permettrait à tous les déclencheurs d’insertion ou de mise à jour de firebase database existants de mettre à jour un champ basé sur un autre champ. Par exemple, un déclencheur de firebase database sur une mise à jour peut mettre à jour l’horodatage modifié uniquement si l’un n’est pas fourni et uniquement si certains champs ont été mis à jour.

La fonctionnalité d’atsortingbuts étendus de la colonne dans SQL Server pourrait peut-être être utilisée pour définir ce champ automatiquement lors de l’extraction afin de ne pas modifier les fichiers XML.

Une autre solution proposée dans cet article consiste à utiliser une classe partielle et une méthode dans le constructeur pour définir les valeurs.

Comment utiliser Entity Framework par défaut et les valeurs de date par défaut

Ce que j’ai trouvé assez simple est de créer une classe partielle pour le (s) modèle (s) d’entité similaire à ce que vous faites pour les annotations de données. Ensuite, je remplace le constructeur par défaut et définit les propriétés par défaut dans le constructeur. Fonctionne comme un charme.

public partial class CallHistoryLog { public CallHistoryLog() { this.NumberFromId = -1L; this.NumberFromName = "NO NAME"; this.NumberToId = -1L; this.NumberToName = "NO NAME"; this.RouteId = -1L; this.Viewed = false; this.Deleted = false; this.DateCreated = DateTime.Now; } }

Voici une solution possible, mais pas jolie:

Le réglage Computed sur une colonne le rendra en lecture seule, mais fera fonctionner la valeur par défaut. Il est possible d’avoir une vraie colonne Calculée, par exemple “LastChangedAt_computed” qui affiche la valeur de “LastChangedAt_default” ou “LastChangedAt_manual”.

Maintenant, la colonne calculée affiche la valeur de la colonne par défaut, sauf si la colonne manuelle n’est pas null, auquel cas elle est affichée. Dans le modèle, le StoragePattern de la colonne par défaut doit être “calculé”.

C’est une solution moche, mais ça devrait marcher.

Hmm … si vous utilisez EF6, c’est beaucoup plus facile que vous ne le pensez. Ouvrez simplement votre modèle, cliquez avec le bouton 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”. Il suffit de remplir et de sauvegarder. Il va configurer le code pour vous.

Le problème avec certaines des 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.

Donc, sous le capot, l’interface utilisateur fonctionne en ajoutant une propriété supplémentaire au fichier edmx:

   

Et en ajoutant le code nécessaire au constructeur:

 public Thingy() { this.Iteration = 1;