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?

24
demandé sur Schneider 2012-08-28 22:19:47

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?

12
répondu Schneider 2012-08-28 18:30:38

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.

9
répondu Henrik 2012-12-07 09:36:46
<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.

8
répondu Mr Nice 2013-01-29 05:25:33

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.
5
répondu SolidSnake 2013-06-04 23:11:52

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.

4
répondu Suplanus 2015-12-05 13:15:41

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")
    {
    }
2
répondu VivekPKumar 2013-03-17 11:06:09

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; }
2
répondu blin2linkme 2014-08-15 08:51:21

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.

1
répondu Sergey 2013-01-28 05:04:44

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

1
répondu Mawuli Sevor 2013-05-02 10:25:50

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.

1
répondu guest 2013-07-26 08:58:35

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

1
répondu nu everest 2014-04-29 16:43:27

cela peut parfois être causé par une propriété d'association ou un attribut clé étranger

1
répondu irfandar 2016-12-13 14:20:22

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.

0
répondu bunny hop 2014-03-07 07:33:48

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 
{}
0
répondu Facundo Sanchez Galindo 2016-03-15 16:41:57

MVC 5 / EF 6

peut-être Pouvez-vous faire cela dans l'ancienne version?

  1. a commenté les chaînes de connexion dans le web / app.config puis enregistrer
  2. 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à
  3. cliquez sur créer
  4. supprimer la nouvelle classe dbcontext
  5. remplacer le contrôleur dbcontext par le vôtre
  6. décommentez les chaînes de connexion au web / App.config puis enregistrer

a fonctionné pour moi!

0
répondu Rick Penabella 2017-10-19 14:18:07

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.

0
répondu Jess 2018-04-13 14:23:25

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é.

0
répondu Hugo 2018-06-12 13:37:34