44 votes

Générer des classes POCO dans différents projet pour le projet avec Entity Framework, modèle

Je suis en train d'utiliser le Modèle de Référentiel avec EF4 à l'aide de VS2010.

À cette fin, je suis en utilisant POCO de génération de code en cliquant droit sur l'entité concepteur de modèle, cliquez sur Ajouter un élément de génération de code. Je puis sélectionnez le modèle POCO et obtenir mes classes.

Ce que je voudrais être en mesure de faire est de ma solution structurée à des projets distincts pour l'Entité (POCO) des classes et un autre projet pour le modèle d'entité et d'un dépôt de code.

Cela signifie que mon projet MVC pourrait utiliser les classes POCO pour fortement typé points de vue, etc et ne pas avoir à connaître le référentiel ou d'avoir une référence.

Pour brancher tous ensemble, je vais avoir un autre projet, avec des interfaces et de l'utilisation du Cio.

Sonne bien dans ma tête, je ne sais pas comment faire pour générer les classes dans leurs propres projet de! Je peux les copier et les modifier ensuite les espaces de noms sur eux, mais je voulais éviter le travail manuel à chaque fois que je change le schéma dans la base de données et souhaitez mettre à jour mon modèle.

Merci

39voto

Alex James Points 15939

En fait les modèles T4 en EF 4.0 ont été conçus avec ce scénario à l'esprit :)

Il y a 2 modèles:

  • Un pour les Entités elles-mêmes (c'est à dire ModelName.tt)
  • L'un pour l'ObjectContext (c'est à dire ModelName.Contexte.tt)

Vous devez mettre le nom du modèle.tt fichier en vous POCO projet, et il suffit de changer le modèle pour pointer vers le fichier EDMX dans la persistance au courant du projet.

Sonne bizarre, je sais: Il y a maintenant une dépendance, mais c'est au T4 temps de génération, et non pas au moment de la compilation! Et ça devrait être bon? Car la POCO assemblée est encore complètement persistance dans l'ignorance.

Voir les étapes 5 et 6 de la présente: http://blogs.msdn.com/adonet/pages/walkthrough-poco-template-for-the-entity-framework.aspx pour plus d'.

Espérons que cette aide

Alex

5voto

hjoelr Points 330

@Nick,

  1. Pour forcer la régénération des entités POCO, il vous suffit de cliquer droit sur le principal .tt le fichier et sélectionnez "Exécuter l'Outil Personnalisé". Cela va l'obliger à se régénérer vos classes POCO avec la mise à jour des modifications apportées à l' .modèle edmx.
  2. Est-il un problème avec vous d'aller de l'avant et en cliquant Droit sur le modèle et en sélectionnant "Générer la Base de données à partir du Modèle..." même si vous n'êtes pas nécessairement générer la base de données? Qui seront les plus susceptibles de vous débarrasser de votre " Erreur 11007...'.
  3. Je pense que c'est l'équivalent d'un "Code Behind". Je ne connais pas plus que ça.

Une autre chose à noter à propos du lien que Alex a donné. Une fois que j'ai déplacé ma main .tt fichier à un autre projet, le fichier qui a été généré à partir de l' ".Contexte.tt" fichier compile pas car il manquait des références à la POCO fichiers qui ont été situé dans un espace de noms différent (parce que je voulais que mon ObjectContext pour être dans un autre domaine que celui de ma POCO fichiers). J'ai dû modifier l' ".Contexte.tt" fichier avait un using Poco.Namespace (où Poco.Namespace est le nom de l'espace de noms où le POCO fichiers ont été générés). Ensuite, cela a permis à mon projet pour compiler.

Joel

4voto

J.G. Hek Points 21

Pour EF5 + DbContext générateur: Il est facile de déplacer votre Nom.Contexte.tt à un projet différent. Toutefois, vous aurez besoin pour référence le modèle de classes. Vous pouvez le faire manuellement, mais cela vous obligera à changer à chaque fois que le code est généré. Vous pouvez également utiliser le même espace de noms pour les deux projets. Ceci est valide et le travail, mais je pense que c'est un mauvais design. Une autre alternative est de changer le modèle T4 (Nom.Contexte.tt).

Changer cette (ligne 43):

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (container.FunctionImports.Any())
{
#>

Pour cela:

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (modelNamespace != codeNamespace)
#>
using <#=code.EscapeNamespace(modelNamespace)#>;
<#
if (container.FunctionImports.Any())
{
#>

Cela permettra de vérifier si votre modèle d'espace de noms est différent de votre code de l'espace de noms, dans l'affirmative, il va insérer le nécessaire à l'aide de la référence de votre modèle de classes.

1voto

Josh Simerman Points 385

J'ai rencontré un sérieux problème lors de l'utilisation de cette approche, combinée avec des Données Dynamiques de projets et de contrôles. Fondamentalement, vous obtenez un message d'erreur.

"Impossible de déterminer une Métatable. Une Métatable n'a pu être déterminée pour la source de données "EntityDataSource1" et on ne peut pas être déduit à partir de l'URL de la requête. Assurez-vous que la table est mappé à la dats source, ou que la source de données est configuré avec un contexte valide, type et nom de la table, ou que la demande est partie d'un régime enregistré d'DynamicDataRoute."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X