web-dev-qa-db-fra.com

Le contrôleur d'ajout d'échafaudage MVC4 génère l'erreur "Impossible d'extraire les métadonnées ..."

J'utilise la version RTM de Windows 8 et de VS 2012 Ultimate. J'ai un projet MVC4 utilisant SqlCe 4.0 avec un modèle de structure d'entité premier code .

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 avec l'échafaudage intégré, j'obtiens le message d'erreur suivant:

"Impossible de récupérer les métadonnées pour MyThing"

"L'utilisation du même fichier DbCompiledModel pour créer des contextes par rapport à différents types de serveurs de base de données N'est pas prise en charge. Créez plutôt un fichier DbCompiledModel distinct pour chaque type de serveur utilisé.

Comment faire fonctionner un échafaudage?

24
Schneider

Par essais et erreurs, j'ai trouvé la ligne de code (c'est le ctor DbContext) à l'origine de 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?

11
Schneider

Je suis également tombé sur ce symptôme lors de l'exécution d'un didacticiel sur la création d'une application MVC Music Store.

Il semble bien y avoir un bogue dans Visual Studio. Ce qui semble déclencher ce bogue 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 avoir trouvé cette solution de contournement.

Un peu plus élaborée, vous devez temporairement modifier le nom de votre chaîne de connexion en ajoutant le nouveau contrôleur d'échafaudage à "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.

9
Henrik

Voici mes deux cents en valeur. Je ne crois pas que votre solution aborde réellement le vrai problème. La vraie solution consiste à transmettre au constructeur de base le nom de la base de données plutôt que le nom de la chaîne de connexion. 

<add name="MyContext" connectionString="Data Source=|DataDirectory|MyDatabase.sdf" providerName="System.Data.SqlServerCe.4.0" />

vous êtes classe de contexte devrait être défini comme 

    public class MyContext : DbContext 
{
    public MyContext() : base("MyDatabase") { }... 

J'espère que cela fonctionne pour vous et pour les autres comme pour moi.

8
Mr Nice

Voici ce qui a fonctionné pour moi:

  • Accédez à la chaîne de connexion dans web.config, modifiez les éléments suivants: providerName="System.Data.SqlClient" 

au lieu de 

providerName="System.Data.SqlServerCe.4.0"

  • Générez votre contrôleur.
  • Renommez providerName à "System.Data.SqlServerCe.4.0".
  • lancez votre projet.
5
SolidSnake

Cela fonctionne pour moi: Dans la boîte de dialogue "Ajouter un nouvel élément échafaudé", j’ai ajouté un nouveau contexte (plus) portant un nom quelconque (pour moi "ScaffoldingContext") . Ensuite, l’échafaudage fonctionne. Il suffit de renommer le contexte dans le contrôleur.

4
Suplanus

Cela peut parfois être causé par une propriété d'association ou un attribut de clé étrangère

2
irfandar

Le problème peut être dû à l'absence de [NotMapped] Attribut dans l'une des classes de modèle.

Comme je manquais l'attribut et que je me rusais la tête.

[Display(Name="Logo")]
[DataType(DataType.Upload)]
[NotMapped]
public HttpPostedFileBase Logo { set; get; }
2
blin2linkme

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 connexion correspond à la valeur transmise au constructeur, cela fonctionne.

 public MyThingDb()
        : base("name=MyContext")
    {
    }
2
VivekPKumar

J'ai résolu ce problème en appuyant sur CTRL + F5 pour reconstruire mon projet avant d'ajouter mon contrôleur.

1
nu everest

J'ai eu un problème similaire en essayant de créer une vue à partir de 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 "Classe de contexte de données", puis le mécanisme d'échafaudage correctement défini.

1
Hugo

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 que votre projet MVC faisant face au Web ne fait pas référence à EntityFramework.

1
Sergey

La solution qui a fonctionné pour moi consiste à transmettre le même nom de base de données que dans votre chaîne de connexion au constacteur de base de votre classe dbContext.

1
guest

Changer les "choses" à l'intérieur 

public
DbSet<MyThing> Things
{ get; set; }
}

to "Database1" où "Database1" est le nom du fichier de base de données sur disque qui apparaît dans votre fichier Web.config en tant que "Database1.sdf".

1
Mawuli Sevor

Dans votre classe de contexte, vous devez commenter DbConfigurationType lorsque vous allez créer un contrôleur avec un échafaudage.

//[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class NameDbContext 
{}

C'est ce qui a fonctionné pour moi ..

J'ai commenté la chaîne de connexion à l'aide de 'System.Data.SqlServerCe.4.0' et de Puis ajouté le contrôleur avec des modèles d'échafaudage.

0
bunny hop

J'ai eu le même message d'erreur, mais cela 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. Le nom de mon modèle était identique à l'un des segments de mon nom d'espace de nom.

Par exemple:

namespace blah.blah.Building

public class Building

J'ai renommé mon espace de noms et corrigé tous les usages, puis l'échafaudage t4 a fonctionné!


Elle est une autre solution possible. Vous devrez peut-être d'abord exécuter un échafaudage pour les modèles "dépendants". Montez ensuite dans des modèles compliqués comportant de nombreuses dépendances.

0
Jess

MVC 5/EF 6

peut-être que vous pouvez le faire dans l'ancienne version?

  1. commenté les chaînes de connexion dans le Web/app.config puis enregistrez
  2. essayez de créer un nouveau contrôleur et que VS crée un "nouvel" élément dbcontext au lieu de choisir celui que vous avez déjà
  3. cliquez sur créer
  4. supprimer la nouvelle classe dbcontext
  5. remplace le contrôleur dbcontext par le vôtre
  6. décommentez les chaînes de connexion dans web/app.config puis enregistrez

travaillé pour moi!

0
Rick Penabella