Ajouter des annotations de données à une classe générée par entity framework
J'ai la classe suivante générées par entity framework:
public partial class ItemRequest
{
public int RequestId { get; set; }
//...
Je voudrais faire un champ obligatoire
[Required]
public int RequestId { get;set; }
Cependant, parce que c'est du code généré cela permettra d'obtenir anéanti. Je ne peux pas imaginer un moyen de créer une classe partielle parce que la propriété est définie par la classe partielle générée. Comment puis-je définir la contrainte de façon sécuritaire?
- Si votre propriété est de type int, il est par défaut requis pour modelbinder de sorte que votre attribut [Obligatoire] ne sera pas ajouter quoi que ce soit ici.
- de modèle.De l'élément.De l'élément.ResourceTypeID) doit échouer côté client. Il ne le fait pas.
Vous devez vous connecter pour publier un commentaire.
La classe générée
ItemRequest
sera toujours unpartial
classe. Cela permet d'écrire une deuxième classe partielle qui est marqué avec les données nécessaires annotations. Dans votre cas, la classe partielleItemRequest
devrait ressembler à ceci:Comme MUG4N répondu, vous pouvez utiliser classes partielles mais sera meilleure utilisation interfaces à la place. Dans ce cas, vous aurez des erreurs de compilation si EF modèle ne correspond pas à la validation du modèle. De sorte que vous pouvez modifier votre EF modèles sans peur que les règles de validation sont obsolètes.
P. S. Si vous utilisez le type de projet qui est diffèrent de ASP.NET MVC (lorsque vous effectuez manuel de validation des données) n'oubliez pas d'enregistrer votre validateurs
J'ai trouvé une solution comme MUG4N's réponse, mais au lieu de cela, l'imbrication de la
MetaData
classe au sein de l'entité de la classe de, réduisant ainsi le nombre de classes dans votre espace de noms de la liste, et en éliminant le besoin d'avoir un nom unique pour chaque classe de métadonnées.[NotMapped]
à l'intérieur de la classe partielle trop quand j'en ai besoin.C'est une sorte d'extension à @dimonser réponse si vous régénérer votre db modèle, vous aurez à nouveau manuellement ajouter des interfaces sur ces classes.
Si vous avez l'estomac pour cela, vous pouvez également modifier votre
.tt
modèles:Ici l'exemple de l'auto-génération d'interfaces sur certaines classes, c'est le fragment de
.tt
il suffit de remplacerEntityClassOpening
méthode dans le vôtre avec la suite (et évidemmentvar stringsToMatch
avec vos noms d'entité et des interfaces).Aucune personne normale devrait le faire pour lui-même si, il a été prouvé, dans la Bible, que l'on va en Enfer pour cela.
Je ne suis pas sûr de la façon de faire ce que vous demandez, mais il y a un moyen de contourner cela. Dynamique de la validation des données en remplaçant la GetValidators de votre personnalisé DataAnnotationsModelValidatorProvider. En lui, vous pouvez lire les règles de la validation de chaque champ (à partir d'une base de données, fichier de config, etc.) et d'ajouter validateurs en tant que de besoin. Il a de la valeur ajoutée que votre validation n'est plus aussi étroitement couplé au modèle et peuvent être modifiés sans même redémarrer le site. Bien sûr, cela peut-être exagéré pour votre cas, mais il est idéal pour les nôtres!
Modifier le modèle T4 ajout d'annotations nécessaires, ce fichier est généralement nommé MODELNAME.tt
trouver où le taux de T4 est la création de la classe et des méthodes pour savoir où mettre ces.
Vous devrez également ajouter les espaces de noms;
Reconstruire vos classes à la sauvegarde de votre modèle, toutes vos méthodes doivent être annotées.