2010-06-04 8 views
3

J'ai un 4 application web en couches programmé en C# ... .Net 4.0:Utilisation EF les classes POCO comme modèles MVC 2 (avec annotations de données)

  • UI couche
  • couche d'affaires
  • données accès couche
  • entités couche

Ma couche de données contient une couche edmx Ma entités contient mes objets POCO (généré par un script t4), et cette couche est référencée dans toutes les autres couches. Lors de la création d'un formulaire MVC pour créer un nouveau client, par exemple .... J'ai déjà la classe client avec des champs pour le prénom, le nom, etc. dans ma couche d'entités, mais cette classe POCO auto-générée ne pas avoir d'annotations de données pour la validation ... IE [Obligatoire], etc. lorsque le formulaire est soumis

Ma solution consiste à créer de nouvelles classes de modèle qui sont à peu près les mêmes que mes classes poco mais qui ont aussi ces annotations de validation supplémentaires. Ce que je veux savoir, c'est s'il existe un moyen facile d'utiliser certains objets POCO dans le modèle MVC (dans la couche UI) sans avoir à réécrire presque la classe ... et aussi sans modifier le t4 qui génère ces POCO classes (puisque je ne suis pas à la vitesse sur t4).

J'ai vu cela à partir d'un autre post sur stackoverflow http://automapper.codeplex.com/ ... pas sûr si cela va le faire ou est la meilleure solution.

Répondre

4

La modification d'un modèle T4 n'est pas très difficile. J'ai récemment fait face au même problème et j'ai décidé de lire un peu sur T4 puis de modifier le template pour créer les propriétés générées comme je le souhaite (annotations, et dans mon cas avec NotifyPropertyChange etc. car j'utilise les mêmes objets POCO dans un MVC UI et dans une interface utilisateur Silverlight).

Même si vous cherchez une solution qui ne nécessite pas de modifier T4, j'espère que c'est utile.

+0

nouvelles choses ... si c'est une bonne solution, alors je vais l'apprendre, mais ce qui me préoccupe, c'est si ces annotations affecteront d'autres domaines du programme qui n'en ont pas besoin. –

+0

@Chris: Les annotations ne devraient pas du tout affecter d'autres parties du programme. Ce ne sont que des attributs (méta-données attachées à une classe/méthode/etc) que le programme peut éventuellement lire s'il le souhaite. La seule exception à laquelle je peux penser est si vous ciblez un runtime limité (par exemple le CLR Silverlight) qui manque certaines méthodes. Dans ce cas, vous pouvez utiliser '#if! SILVERLIGHT' pour cacher ces attributs à Silverlight. –

6

Si votre classe POCO est déclarée en tant que telle:

public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

alors si vous changez juste le T4 pour en faire une classe partielle, vous pouvez alors définir dans un fichier séparé:

[MetadataType(typeof(PersonMetadata))] 
public partial class Person { 

    internal class PersonMetadata { 

     [Required] 
     // insert other metadata here 
     public string FirstName { get; set; } 

     // and if you don't want metadata for lastname, you can leave it out 
    } 
} 

Deux points supplémentaires - la classe de métadonnées n'a pas besoin d'être imbriquée dans le partiel que vous définissez, je pense que c'est plus net. En outre, les types ne doivent pas correspondre dans la classe de métadonnées, donc vous pouvez les faire tous objet si vous le souhaitez (et vous pourriez voir quelques exemples sur le web avec ça comme ça)

+0

Est-ce que ces classes partielles doivent aller dans mon dossier "Models" dans la couche IU, ou puis-je les référencer à partir de ma couche Entités? –

+0

@Chris: C'est une solution élégante pour ajouter des métadonnées personnalisées. Si vous avez besoin d'affecter le corps de la méthode comme je l'ai fait, cela ne fonctionnerait pas (j'ai dû ajouter NotifyPropertyChange). –

Questions connexes