J'ai la classe suivante générée par le framework d'entité:
public partial class ItemRequest
{
public int RequestId { get; set; }
//...
Je voudrais en faire un champ obligatoire
[Required]
public int RequestId { get;set; }
Cependant, comme il s'agit de code généré, cela sera effacé. Je ne peux pas imaginer un moyen de créer une classe partielle car la propriété est définie par la classe partielle générée. Comment puis-je définir la contrainte de manière sûre?
c#
entity-framework
asp.net-mvc-4
P.Brian.Mackey
la source
la source
Réponses:
La classe générée
ItemRequest
sera toujours unepartial
classe. Cela vous permet d'écrire une deuxième classe partielle qui est marquée avec les annotations de données nécessaires. Dans votre cas, la classe partielleItemRequest
ressemblerait à ceci:la source
Comme MUG4N a répondu, vous pouvez utiliser des classes partielles, mais il sera préférable d'utiliser des interfaces à la place. Dans ce cas, vous aurez des erreurs de compilation si le modèle EF ne correspond pas au modèle de validation. Vous pouvez donc modifier vos modèles EF sans craindre que les règles de validation ne soient obsolètes.
PS Si vous utilisez un type de projet différent de ASP.NET MVC (lorsque vous effectuez une validation manuelle des données) n'oubliez pas d'enregistrer vos validateurs
la source
J'ai trouvé une solution comme la réponse de MUG4N , mais à la place, imbriquant la
MetaData
classe dans la classe d'entité, réduisant ainsi le nombre de classes dans votre liste d'espaces de noms publics, et éliminant le besoin d'avoir un nom unique pour chaque classe de métadonnées.la source
[NotMapped]
à l'intérieur de la classe partielle lorsque j'en ai besoin.C'est une sorte d'extension de la réponse @dimonser si vous régénérez votre modèle de base de données, vous devrez ré-ajouter manuellement des interfaces sur ces classes.
Si vous avez l'estomac pour cela, vous pouvez également modifier votre
.tt
modèles:Voici un exemple d'interfaces générant automatiquement sur certaines classes, il s'agit d'un fragment de la méthode de
.tt
remplacementEntityClassOpening
de la vôtre par la suite (et évidemmentvar stringsToMatch
avec les noms et interfaces de vos entités).Cependant, aucune personne normale ne devrait se faire cela, il a été prouvé dans la Bible que l'on va en Enfer pour cela.
la source
Je ne sais pas comment faire ce que vous demandez, mais il existe un moyen de contourner le problème. Validation dynamique des données en remplaçant les GetValidators de votre DataAnnotationsModelValidatorProvider personnalisé. Vous pouvez y lire les règles de validation de chaque champ (à partir d'une base de données, fichier de configuration, etc.) et ajouter des validateurs selon les besoins. Il a les valeurs ajoutées que votre validation n'est plus étroitement liée au modèle et peut être modifiée sans même avoir besoin de redémarrer le site. Bien sûr, cela pourrait être exagéré pour votre cas, mais c'était idéal pour le nôtre!
la source
Modifiez le modèle T4 en ajoutant les annotations requises, ce fichier est généralement nommé MODELNAME.tt
trouver où le T4 crée la classe et les méthodes pour savoir où les mettre.
Vous devrez également ajouter les espaces de noms;
Reconstruisez vos classes en sauvegardant votre modèle, toutes vos méthodes doivent être annotées.
la source