web-dev-qa-db-fra.com

Le contexte ne peut pas être utilisé pendant la création du modèle

Dans mon application je reçois l'erreur suivante:

Le contexte ne peut pas être utilisé pendant la création du modèle.

Je ne suis pas sûr de ce que cela signifie. J'ai tout fait comme d'habitude et habituellement cela fonctionne mais pour celui-ci ce n'est pas. Ci-dessous mon code:

App.config:

 <connectionStrings>
    <add name="DatabaseContext" connectionString="Data Source=./SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
 </connectionStrings>

Produits.cs:

class Products
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

DatabaseContext.cs:

class DatabaseContext : DbContext
{
    public DbSet<Products> Products { get; set; }
}

Program.cs:

DatabaseContext context = new DatabaseContext();

try
{
   var products = context.Products.ToList();

   foreach (var item in products)
   {
      Console.WriteLine(item.ProductID + " : " + item.ProductName);
   }
      Console.ReadLine();
}

La ligne est en échec est var products = context.Products.ToList();

Des idées ce qui pourrait être la cause? J'ai mis en place 2 produits dans ma base de données, il devrait donc les afficher en sortie.

MODIFIER

Voici tout mon fichier App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.Microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <connectionStrings>
    <add name="DatabaseContext" connectionString="Data Source=./SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>
25
CallumVass

Dans votre fichier App.Config sous connectionstrings, vous avez une barre oblique (./SQLEXPRESS). Changez cela en une barre oblique inverse.\SQLEXPRESS comme ceci:

<add name="DatabaseContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
15
mjbates7

J'ai déjà rencontré ce problème par le passé et il était généralement dû qu'il n'utilisait pas la version la plus récente + problème de référencement.

Essayez d’obtenir la dernière version EF de NuGet pour tous vos projets et voyez si l’erreur disparaît:
http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-released.aspx

METTRE &AGRAVE; JOUR
Une autre raison de cette erreur peut être que lors de la création du contexte pour la première fois et par conséquent de la création du modèle, vous créez un autre contexte sur un thread séparé. Vous devrez attendre que d'autres instances de contexte soient créées une fois la création du modèle terminée.

15
ntziolis

J'ai pu résoudre ce problème en ajoutant

MultipleActiveResultSets=true

à la chaîne de ma connexion EF.

Je l'ai corrigé en ajoutant ce paramètre de connexion à plusieurs threads.

9
Carlos B. Vasquez

J'ai également eu cette erreur, mais j'ai pu la résoudre en déclarant un contexte de variable locale à l'intérieur de chaque thread plutôt que d'utiliser celui que j'avais déclaré globalement.

    Parallel.ForEach(myList, l=>
    {
        MyContext _db = new MyContext();
        // do some stuff....
        _db.Model.Add(....);
        _db.SaveChanges();

    });

Assurez-vous également de définir MultipleActiveResultSets = true dans votre chaîne de connexion, comme décrit ci-dessus.

2
nurdyguy

Résolu par le suivant:

J'ai eu le même problème dans ma demande et résolu en utilisant le ci-dessous.

  1. Vérifiez vos noms de modèle et les noms de table et il devrait correspondre.

  2. Les noms de type de données et de colonne utilisés dans le modèle et le nom de colonne/type de données de la table de base de données doivent correspondre.

  3. utilisez le code ci-dessous dans votre classe de contexte

    Public class MVCRepositoryContext : DbContext 
    {
        static MVCRepositoryContext()
        {
            Database.SetInitializer < mvcrepositorycontext > (null);
        }
    
        public MVCRepositoryContext():base("MVCRepositoryContext"){ }
    
        public virtual DbSet<customer> Customers { get; set; }
    
        public virtual DbSet<book> Books { get; set; }
    
        public virtual DbSet<author> Authors { get; set; }
    }
    
1
Jebasingh

Dans mon cas, j'utilisais Code First et j'avais oublié de mettre à jour la base de données pour les derniers changements. Le contexte et la base de données doivent être identiques. Sinon, entrez le code suivant dans le gestionnaire de paquets.

Update-Database
1
Ahmet Gokdayi

Je sais que c'est un vieux ticket, mais je pourrais aussi aider d'autres personnes ayant le même problème. Dans mon cas, je ne chargeais pas de contexte dans une chaîne de connexion dans le fichier app.config:

par exemple.

<add name="SalesContext" connectionString="" providerName="System.Data.SqlClient" />

Cela devrait fonctionner.

Salutations.

0
Deutsche Mexa

J'ai également eu le même problème ... Cependant, mon problème était que j'utilisais un fournisseur de rôle personnalisé. Ce fournisseur de rôle avait une référence à mon contexte qui restait ouverte toute la durée de vie de l'application. Ce n'était pas un problème jusqu'à ce que plusieurs navigateurs Web tentent de faire des demandes en même temps. 

Ma solution consistait à créer un nouveau contexte dans le RoleProvider personnalisé dans chaque méthode remplacée et à le supprimer via l'instruction using.

using(var ctx = new Entities())
{
    //do stuff                
}

Donc, si vous obtenez cette erreur, vous devez examiner votre trace de pile et voir sur quelle méthode/fichier l'erreur se produit, puis modifier la méthode/classe incriminée pour supprimer le contexte à chaque fois.

Dans mon cas, j'utilise Ninject DI et ai implémenté DI sur mon fournisseur de rôle personnalisé ainsi que dans un filtre d'action personnalisé. Pour résoudre le problème de plusieurs threads accédant au même contexte, j'ai supprimé la DI dans ces classes et je me suis mis à créer un nouveau contexte pour chaque classe. 

0
Zach Painter

J'ai eu le même problème et l'ai résolu en utilisant le code suivant: 

Database.SetInitializer<EntitiesName>(null);
0
Stefan Michev

J'ai aussi rencontré le même problème aujourd'hui. 
Dans mon cas redémarrer Visual Studio résolu le problème. 

0

Ajoutez le constructeur DatabaseContext avec le nom du catalogue de la base de données.

public class DatabaseContext : DbContext {
    public DbSet<Products> Products { get; set; }

    public DatabaseContext() : base("ProjectCode") {}
}

Changez la configuration de entityframework dans app.config comme ceci.

<parameter value="Data Source=./SQLEXPRESS;Initial Catalog=ProjectCode;Integrated Security=SSPI;MultipleActiveResultSets=true" />

Ajoutez des annotations à la classe Products. Assurez-vous que votre base de données contient une table "Produits" avec les champs de remorquage "ProductId" et "ProductName".

class Products {
    [Key]
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

Si l'erreur persiste, essayez de modifier le cadre cible de votre projet afin qu'il utilise .net framework 4.0.

0
AlanCai

J'ai eu le même problème. J'ai vérifié ma chaîne de connexion et me suis assuré que le service SQL Server est en cours d'exécution pour résoudre ce problème.

0
Nabeel

Une erreur dans votre code est toujours d'utiliser le contexte de base de données dans le bloc using. Le contexte de base de données n'est pas thread-safe. Et est mieux utilisé un instant par demande

0
Alex