2010-03-18 11 views
2

Je commence avec Entity Framework 4, en utilisant le développement basé sur le modèle. Je construis une application de démonstration WPF simple pour apprendre le cadre. Mon application a deux entités, Sujet et Note. Un sujet est un sujet de discussion; il a des propriétés Title, Text et DateRevised. Le sujet a également une propriété de collection Notes. Une note a des propriétés DateCreated et Text.Utilisation de modèles T4 pour ajouter du code personnalisé aux entités générées EF4?

J'ai utilisé EF4 pour créer un EDM et un magasin de données pour l'application. Maintenant, je dois ajouter juste un peu d'intelligence aux entités. Par exemple, l'accesseur de propriété de la propriété Topic.Text doit mettre à jour la propriété Topic.DateRevised et une note doit définir sa propriété DateCreated lorsqu'elle est instanciée, ce qui est assez simple. Je suppose que je ne peux pas modifier les classes générées directement, car mon code serait perdu si les entités sont re-générées.

Est-ce le genre de chose que je peux mettre en œuvre en modifiant le modèle T4 utilisé par EF4 pour générer les entités? En d'autres termes, un gabarit T4 peut-il être modifié pour ajouter mon code pour l'exécution de ces tâches aux entités qu'il génère? Pouvez-vous me référer à un bon tutoriel ou à une explication sur la façon de commencer?

La plupart de ce que j'ai trouvé jusqu'à maintenant parle de la façon d'ajouter un fichier tt à un EDM, donc je peux le faire. Ce que je recherche est une ressource que je peux utiliser pour passer au niveau suivant, en supposant qu'un modèle T4 peut être utilisé pour personnaliser les entités générées comme je l'ai décrit. Merci de votre aide.

Répondre

2

Vous pouvez le faire sans T4, en utilisant des classes partielles et des méthodes partielles.

Chaque propriété EF aura une méthode partielle OnPropertyNameChanged. Si vous implémentez cela dans une classe partielle, vous pouvez ajouter le comportement dont vous avez besoin et vous ne perdrez pas vos modifications lors de la mise à jour. Pour ajouter un nouveau fichier, disons Topic.cs. Là, vous écrivez:

namespace MyNamespace 
{ 
    public partial class Topic 
    { 
     partial void OnTextChanged() 
     { 
      this.DateRevised = DateTime.Now; 
     } 
    } 
} 
+0

Sans blague! Qui aurait cru que c'était aussi simple? J'aime EF4 plus je travaille avec. Des suggestions comment implémenter le code Note.DateCreated? Cela devrait normalement aller dans un constructeur, car il est destiné à être défini uniquement lorsqu'une note est créée, plutôt que lorsque son texte change. –

+0

Oui, le constructeur va bien. Vous pouvez ajouter un constructeur sans paramètre à la classe partielle et cela fonctionnera. Mais vous pouvez également envisager la couche de règles métier, en fonction de ce que vous faites exactement. –

+1

Pour le bénéfice de quelqu'un d'autre recherchant cette question - je n'ai pas réalisé qu'une classe partielle peut avoir son propre constructeur. S'il existe deux classes partielles, les deux constructeurs sont exécutés. –