2011-02-13 1 views
2

J'utilise EF-CodeFirst pour créer la base de données à partir de mes objets Poco et de leur configuration. J'ai beaucoup utilisé Dataannotation (Required, DataLength, RegularExpression, DataType) pour obtenir des métadonnées à MVC et avoir les messages d'erreur pointant vers une ressource pour les localiser plus tard.Comment partager des annotations de données entre des classes EF CodeFirst Poco classées et ViewModel dans MVC?

Pour les opérations CRUD simples, ce n'est pas un problème.

Mais dès que j'ai besoin de classes ViewModel, je perds les annotations de données de mes objets Poco.

Comment ces 2 designs peuvent-ils être combinés sans avoir à blesser le principe DRY (ne pas répéter vous-même)?

Merci Andreas

Répondre

2

Vous pouvez accomplir ce que vous demandez assez facilement. Darin a un point très valable qui s'applique bien aux projets de plus grande envergure, mais je pense que pour les plus petits projets, cela ressemble à une surenchère. Il semble également que cela dépend beaucoup de savoir si vous utilisez DataAnnotations pour la validation ou l'utilisation d'une bibliothèque tierce. La repitition impliquée dans le fait de ne pas le faire ferait pour toute une nuisance de maintenance, à mon humble avis. Il y a aussi le fait que vous passez beaucoup de lignes de code à copier des données de la base de données vers le modèle de vue; Les ORM sont censés aider à éliminer cela, mais jusqu'à présent, la solution ne semble pas très bonne.

Voici un exemple de code sur comment faire ce que vous voulez. La première classe est partielle, le corps principal étant dans le code généré par EF (je vais d'abord modéliser, pas le code d'abord). En outre, à titre d'exemple, Question a un FK à QuestionGroup. Dans la base de données, il s'agit d'une colonne nommée GroupID, mais dans ViewModel, il y a une propriété nommée GroupName à afficher dans une jolie petite grille (Telerik Grid, en fait, qui casse si vous essayez de transmettre un objet EF).

[MetadataType(typeof(QuestionMetadata))] 
public partial class Question 
{ 
} 

public class QuestionMetadata 
{ 
    public Int32 ID { get; set; } 

    [Required] 
    [Display(Name="Question")] 
    public String QuestionText { get; set; } 

    [Display(Name = "Order")] 
    public Int16 SortOrder { get; set; } 
} 

[MetadataType(typeof(QuestionMetadata))] 
public class QuestionViewModel 
{ 
    /* Fields found in the original model */ 

    public Int32 ID { get; set; } 

    public String QuestionText { get; set; } 

    public Int16 SortOrder { get; set; } 

    /* Fields that map child object data for this view model */ 

    [Display(Name = "Question Group")] 
    public String GroupName { get; set; } 
} 

à mon humble avis à la fois EF et Telerik me forcent à ne pas être très sec ici, mais il n'y a rien que je puisse faire. EF devrait générer ces DataAnnotations par défaut (ou au moins avoir l'option), car il sait évidemment quels champs sont requis (pas null) ou quelle est la longueur maximale des différentes chaînes. Puis Telerik me force à créer le ViewModel, qui est aussi douloureux.

+0

Merci beaucoup pour votre réponse. Je connaissais en effet l'attribut MetadataType mais j'ai complètement oublié que je pouvais l'utiliser ici aussi. – nttakr

4

Ces deux modèles ne peuvent pas et ne doivent pas être combinés. Vos modèles de vue sont liés aux vues, donc personnellement, je redéfinis tous les attributs nécessaires sur mes modèles de vue et croyez-le ou non, je ne me soucie pas de DRY dans ce cas. Je fais cela parce que les exigences de mon point de vue changent assez souvent (oui les clients sont capricieux) alors que je réutilise toujours les mêmes modèles de domaine. Pour moi, une vue ne devrait jamais connaître l'existence d'un modèle de domaine. Une vue devrait être factice et tout ce qu'elle devrait savoir est le modèle de vue qui lui est transmis par le contrôleur.

Je sais qu'il y a des gens qui pourraient penser différemment et je respecte leur opinion. Donc, en disant cela, je ne fais qu'exposer mon point de vue personnel et ma façon de travailler avec ASP.NET MVC. Et pour être honnête avec vous mes modèles sont des objets POCO sans DataAnnotations donc je ne rencontre pas de tels problèmes. J'utilise DataAnnotations sur mes modèles de vue uniquement à des fins de mise en forme (des choses comme DataType, DisplayName et DisplayFormat) et aucun attribut de validation. J'utilise FluentValidation.NET à cette fin.

+0

Salut Darin! Merci beaucoup d'avoir exprimé votre opinion. Après tout, c'est toujours un avantage d'entendre quelles pensées d'autres personnes avaient pour choisir leur conception. Je dois admettre que votre point sur le découpage de formatage et datamodel est un point très valable. Je pense que j'ai commencé par utiliser le code EF d'abord et je me suis laissé emporter par l'annotation.Et je vais certainement jeter un oeil à FluentValidation.NET. Merci pour votre message. – nttakr

Questions connexes