MVC4 Échafaudage Ajouter un contrôleur donne une erreur " Impossible de récupérer des métadonnées…"
j'utilise la version RTM de Windows 8 et VS 2012 Ultimate. J'ai un MVC4 projet à l'aide de SqlCe 4.0 avec un premier code de modèle d'entity framework.
le Modèle est très simple:
public class MyThing
{
public int MyThingId { get; set; }
public int UserId { get; set; }
public string Title { get; set; }
public string Address { get; set; }
public string Description { get; set; }
public DateTime Date { get; set; }
}
Lorsque j'essaie de créer un nouveau contrôleur de l'échafaudage trop j'obtiens l'erreur suivante:
"Impossible de récupérer les métadonnées pour MyThing"
" en utilisant le même DbCompiledModel pour créer des contextes contre différents types de les serveurs de bases de données ne sont pas pris en charge. Au lieu de cela, créer un DbCompiledModel séparé pour chaque type de serveur utilisé.
Comment faire fonctionner un échafaudage?
17 réponses
par essai et erreur j'ai trouvé la ligne de code (C'est le ctor DbContext) qui cause l'erreur:
public class MyThingDb : DbContext
{
// If I comment this constructor out the scaffolding works
public MyThingDb()
: base("DefaultConnection")
{
}
public DbSet<MyThing> Things{ get; set; }
}
WTF?
j'ai aussi trébuché sur ce symptôme en exécutant un tutoriel sur le sujet de la construction d'une application MVC Music Store.
il semble bien qu'il y ait un bug Dans Visual Studio. Ce qui semble déclencher ce bug est de choisir un nom, autre que le nom par défaut, utilisé pour la chaîne de connexion.
Mes remerciements vont à l'utilisateur dwaynef sur http://forums.asp.net/t/1838396.aspx/1 pour trouver cette solution de contournement.
Un peu élaboré, vous devez, temporairement lors de l'ajout du nouveau contrôleur d'échafaudage, changez le nom de votre chaîne de connexion en "DefaultConnection" dans web.config:
<connectionStrings>
<add name="DefaultConnection" ... />
</connectionStrings>
si vous avez plus d'une chaîne de connexion - assurez-vous que seule celle-ci est présente lors de l'exécution de l'action.
<add name="MyContext" connectionString="Data Source=|DataDirectory|MyDatabase.sdf" providerName="System.Data.SqlServerCe.4.0" />
votre classe de contexte doit être définie comme
public class MyContext : DbContext
{
public MyContext() : base("MyDatabase") { }...
Espérons que cela fonctionne pour vous et les autres, comme il le fait pour moi.
Voici ce qui a fonctionné pour moi:
- allez à chaîne de connexion dans le web.modifier la configuration comme suit:
providerName="System.Data.SqlClient"
au lieu de
providerName="System.Data.SqlServerCe.4.0"
- générez votre contrôleur.
- renommer providerName retour à"
System.Data.SqlServerCe.4.0
". - exécuter votre projet.
Fonctionne pour moi: Dans la boîte de dialogue" Ajouter un nouvel élément Scaffolded", j'ai ajouté un nouveau contexte (plus) avec n'importe quel nom (pour moi"ScaffoldingContext"). Alors l'échafaudage fonctionne. Il suffit de renommer le contexte dans le Contrôleur.
après avoir essayé différentes options, la méthode ci-dessous résout l'erreur..
si la valeur du nom dans la chaîne de caractères correspond à la valeur transmise au constructeur, cela fonctionne.
public MyThingDb()
: base("name=MyContext")
{
}
le problème peut être dû à une disparition
[NotMapped]
l'Attribut
dans un de la classe du modèle.
comme j'ai manqué l'attribut et j'étais rusé ma tête.
[Display(Name="Logo")]
[DataType(DataType.Upload)]
[NotMapped]
public HttpPostedFileBase Logo { set; get; }
j'avais un problème similaire mais ce n'était pas le constructeur par défaut. Cela se produit également si vous avez plusieurs projets dans votre solution et votre projet "Web" face à MVC ne fait pas référence à Entitefram Framework.
Changer "les Choses" de l'intérieur
public
DbSet<MyThing> Things
{ get; set; }
}
pour
"Database1" où "Database1" est le nom du fichier de base de données sur le disque qui apparaît dans votre Web.config
le fichier "Database1.sdf
la solution qui a fonctionné pour moi est de passer le même nom de base de données que dans votre chaîne de connexion à la constance de base de votre classe dbContext.
j'ai résolu ce problème en appuyant sur CTRL+F5 pour reconstruire mon projet avant d'ajouter mon contrôleur.
cela peut parfois être causé par une propriété d'association ou un attribut clé étranger
C'est ce qui a fonctionné pour moi ..
j'ai commenté la chaîne de connexion en utilisant le système.Données.SqlServerCe.4.0 " et puis on a ajouté le contrôleur avec les gabarits d'échafaudage.
dans votre classe de contexte, vous devez commenter le type DbConfigurationType lorsque vous allez créer un contrôleur avec échafaudage.
//[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class NameDbContext
{}
MVC 5 / EF 6
peut-être Pouvez-vous faire cela dans l'ancienne version?
- a commenté les chaînes de connexion dans le web / app.config puis enregistrer
- essayez de créer un nouveau contrôleur et d'avoir VS créer un" nouveau " élément dbcontext au lieu de choisir celui que vous avez déjà
- cliquez sur créer
- supprimer la nouvelle classe dbcontext
- remplacer le contrôleur dbcontext par le vôtre
- décommentez les chaînes de connexion au web / App.config puis enregistrer
a fonctionné pour moi!
j'avais le même message d'erreur, mais ça n'avait rien à voir avec la chaîne de connexion.
C'est un cas très rare, mais j'espère que cela aidera quelqu'un. Mon nom de modèle est le même que l'un des segments de mon nom d'espace de noms.
Par exemple:
namespace blah.blah.Building
public class Building
j'ai renommé mon espace de noms et corrigé tous les usages et puis l'échafaudage t4 a fonctionné!
C'est une autre solution possible. Vous pourriez avoir à exécuter échafaudage pour " dépendant" les modèles de première. Puis travaillez votre chemin jusqu'à des modèles compliqués qui ont beaucoup de dépendances.
j'ai eu un problème similaire en essayant de créer une vue depuis mon contrôleur en utilisant l'échafaudage. Dans la boîte de dialogue Créer une vue, j'ai tout simplement effacé la liste déroulante de la "classe de contexte de données", puis le mécanisme d'échafaudage a été finalisé.