T4 – Erreur Entity Framework: Méthode introuvable: ‘System.Data.Entity.DbSet`1

Essayer de créer un T4 assez simple que j’essaye de charger quelques valeurs que je peux utiliser pour plus tard:

  <#@ assembly name="c:\users\\documents\visual studio 2015\Projects\2_DataModelGenerator\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll" #> <#@ assembly name="c:\users\\documents\visual studio 2015\Projects\2_DataModelGenerator\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll" #> <#@ assembly name="c:\users\\documents\visual studio 2015\Projects\2_DataModelGenerator\2_Data\bin\Debug\2_Data.dll" #>        

Quand je sauve le T4, j’obtiens cette erreur:

Erreur lors de l’exécution de la transformation: System.MissingMethodException: Méthode introuvable: ‘System.Data.Entity.DbSet`1 2_Data.DevEntities.get_tblDatas ()’

J’ai testé ce code dans une autre solution (utilisant EF 6.1.3) et cela fonctionne sans problème (charge les données dans var labelClassNames ). Cela semble être un problème uniquement dans le modèle T4.

Dois-je importer un autre espace de noms? Je ne suis pas sûr de ce que je manque!

Mettre à jour:

Dans mon code TT:

  dbc context = new dbc(); DevEntities mdc = new DevEntities(); mdc = context.returnContext(); 

Ajout d’un cours dans ma bibliothèque de cours:

 public class dbc { private DevEntities dbContext; public dbc() { dbContext = new DevEntities(); } public DevEntities returnContext() { return dbContext; } } 

Même erreur que précédemment:

Exécution de la transformation: System.MissingMethodException: Méthode introuvable: ‘System.Data.Entity.DbSet

Cependant, lorsque je débogue le modèle t4, je reçois un message différent:

Aucune chaîne de connexion nommée ‘DevEntities’ n’a pu être trouvée dans le fichier de configuration de l’application.

Cependant, j’ai copié le fichier App.config de ma bibliothèque de classes qui inclut le fichier .edmx dans mon projet contenant le fichier .tt

Des idées?

Les classes du même projet de modèle T4 ne sont pas visibles par celui-ci. Pour simplifier son débogage, voici une étape à suivre pour exécuter T4 avec succès dans EntityFramework sans problème ni facilité de débogage:

étape 1: créer un projet de bibliothèque de classes distinct pour le modèle

Créez un projet de bibliothèque de classes distinct pour le modèle, à référencer par votre application et le modèle T4.

Cela simplifie également les tests unitaires et résout de nombreux problèmes avec T4.

Étape 2: résolution de la chaîne de connexion

Pour éviter les problèmes de fichier de configuration et configurer correctement la chaîne connectionSsortingng, créez une classe partielle qui étend la classe Context pour éviter le remplacement lors de la régénération du contexte. Définir le nouveau constructeur de surcharge.

par exemple, NorthwindEntities

  using System.Data.Entity; namespace NorthWin { public partial class NorthwindEntities : DbContext { public NorthwindEntities(ssortingng connSsortingng) : base(connSsortingng) { } } } 

step3: Créer toutes les méthodes DAL dans des classes séparées

Toutes les méthodes dont vous avez besoin dans un modèle T4, créez-les dans des classes distinctes dans le même projet de bibliothèque de classes et appelez-les à partir d’un modèle T4.

Définissez explicitement connectionSsortingng dans votre classe (notez le guillemet simple dans la chaîne de connexion). Modifier: ou vous pouvez utiliser le modèle d’inclusion. Exemple:

  using System.Linq; namespace NorthWin { public class DAL { ssortingng ConnectionSsortingng = @"metadata=res://*/NorthWind.csdl|res://*/NorthWind.ssdl|res://*/NorthWind.msl;provider=System.Data.SqlClient;provider connection ssortingng='data source=myserver;initial catalog=Northwind;persist security info=True;user id=xxx;password=yyy;MultipleActiveResultSets=True;App=EntityFramework';"; public DAL (ssortingng connSsortingng) { ConnectionSsortingng =connSsortingng; } public int GetCustomerCount() { var n = 0; // call ye new overload constructor using (var ctx = new NorthwindEntities(ConnectionSsortingng)) { n = ctx.Customers.Count(); } return n; } } } 

étape 4: créez votre T4 Définissez les assemblys minimum pour les méthodes EntityFramework et Call DAL

Exemple

  <#@ template debug="false" hostspecific="true" language="C#" #> <#@ output extension=".txt" #> <#@ assembly name="System.Xml"#> <#@ assembly name="$(TargetDir)NorthWin.dll" #> <#@ assembly name="$(TargetDir)EntityFramework.dll" #> <#@ assembly name="$(TargetDir)EntityFramework.SqlServer.dll" #> <#@ assembly name="EnvDTE" #> <#@ assembly name="System.Configuration" #> <#@ import namespace="System.Configuration" #> <#@ import namespace="System" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="NorthWin" #> <# int n=0; var dal = new DAL(); / /call DAL methods n= dal.GetCustomerCount(); #> <#= n #> { ... // More code here. } 

Sortie du modèle T4:

 114 { ... // More code here. } 

Modifier:

Vous pouvez obtenir le fichier connectionSsortingng à partir du fichier de configuration en utilisant le fichier include, comme décrit dans:

Injection de votre chaîne de connexion Web.Config dans votre modèle T4

vous transmettez ensuite la chaîne connectionSsortingng à vos classes DAL avec le constructeur qui accepte la chaîne de connexion.

dans votre modèle, ajoutez ce code

 <#@ include file="ConfigurationAccessor.ttinclude" #> <# var config = new ConfigurationAccessor((IServiceProvider)this.Host, @"path\to\ProjectWithConfig.csproj"); string connectionString = config.ConnectionStrings["MainConnectionString"].ConnectionString; #>