6

Je viens de créer un contrôle utilisateur. Ce contrôle utilise également ma classe Entity Framework statique pour charger deux zones de liste déroulante. Tout va bien et fonctionne sans problème. La conception et l'exécution fonctionnent. Ensuite, lorsque j'arrête l'application, tous les formulaires qui contiennent mon UserControl ne fonctionnent plus dans la conception. Je vois juste deux erreurs:EF dans un UserControl ne peut pas voir le app.config?

Erreur1: La connexion nommée spécifiée est introuvable dans la configuration, n'est pas destinée à être utilisée avec le fournisseur EntityClient, ou n'est pas valide.

Erreur 2: La variable ccArtikelVelden est non déclarée ou n'a jamais été affectée. (ccArtikelVelde est mon UserControl)

Runtime tout fonctionne

Ma classe statique EF Repositoy:

public class BSManagerData 
{ 
    private static BSManagerEntities _entities; 
    public static BSManagerEntities Entities 
    { 
     get 
     { 
      if (_entities == null) 
       _entities = new BSManagerEntities(); 
      return _entities; 
     } 
     set 
     { 
      _entities = value; 
     } 
    } 
} 

une certaine logique qui se passe dans mon UserControl pour charger les données dans les listes déroulantes:

private void LaadCbx() 
{ 
    cbxCategorie.DataSource = (from c in BSManagerData.Entities.Categories 
           select c).ToList(); 
    cbxCategorie.DisplayMember = "Naam"; 
    cbxCategorie.ValueMember = "Id"; 
} 

private void cbxCategorie_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    cbxFabrikant.DataSource = from f in BSManagerData.Entities.Fabrikants 
           where f.Categorie.Id == ((Categorie)cbxCategorie.SelectedItem).Id 
           select f; 
    cbxFabrikant.DisplayMember = "Naam"; 
    cbxFabrikant.ValueMember = "Id"; 
} 

la seule façon de faire mes formes fonctionnent à nouveau, le temps de conception, est de commenter la partie EF dans le UserControl (voir ci-dessus) et reconstruire. C'est très étrange, tout est dans le même assemblage, même espace de nom (par souci de simplicité).

Quelqu'un a une idée?

+2

J'ai arrêté de lire dès que j'ai lu les mots «classe Entity Framework statique». Arrêter de faire ça. À présent. Le 'ObjectContext' n'est pas conçu pour être utilisé de cette façon. – Aaronaught

Répondre

8

On dirait que vous exécutiez en quelque sorte le code de base de données en mode de conception. Pour éviter cela, traquer le contrôle et la méthode faisant cela, et utiliser:

if (DesignMode) 
    return 

En outre, il est une très mauvaise idée de mettre en cache le contexte de base de données statique. Cela causera des problèmes avec le multithreading, et aussi lorsque vous faites des insertions et des suppressions. Le contexte de base de données est destiné à être utilisé pour une seule "unité de travail", en ajoutant 2 et en supprimant 3 autres objets et en appelant SaveChanges une fois.

+0

Merci pour vos réponses Je suis tout pour la meilleure pratique et si l'utilisation de la classe statique est une mauvaise pratique, je dois voir comment je devrais le faire d'une autre manière. Le problème est que j'ai eu une erreur il y a quelque temps où je ne pouvais pas éditer un objet d'un autre contexte. J'ai lu sur StackOverflow que la création d'une classe statique était l'une des solutions. C'est pourquoi je suis allé pour cette approche. Je ne suis pas non plus un grand fan de chaque fois que j'ai besoin d'accéder à la base de données, construire une déclaration d'utilisation autour de mon opération. Je suis nouveau chez EF, donc tout conseil constructif est plus que bienvenu! – Sven

+0

Juste essayé ce que vous avez proposé mais toujours pas bon. Maintenant, j'ai fait ce qui suit: privé void LaadCbx() { si (DesignMode) retour; cbxCategorie.DataSource = (à partir de c dans BSManagerData.Entities.Categories select c) .ToList(); cbxCategorie.DisplayMember = "Naam"; cbxCategorie.ValueMember = "Id"; } Toutefois, lorsque j'essaie d'ajouter le contrôle à mon formulaire, j'obtiens l'erreur suivante: http://img716.imageshack.us/img716/6549/eferror.png – Sven

+0

D'où appelez-vous LaadCbx()? Dans le cas où vous l'appelez d'un constructeur, essayez de le retirer du constructeur du contrôle. Il est préférable (pas seulement pour ce problème, mais en général) de faire le moins possible dans le constructeur, en particulier les connexions DB. Vous devriez être capable d'utiliser un crochet comme OnLoad pour charger les données à la place. –

2

J'ai fait face au même problème,

Dans mon cas, je l'ai ajouté quelques codes de base de données en cas de chargement de contrôle utilisateur qui utilisaient des bibliothèques, qui ne sont pas chargés jusqu'à l'exécution.

Il est donc conseillé, ne pas écrire un code de base de données en cas de charge de contrôle de l'utilisateur.

Espérons que cela vous aide!

+0

Merci, mon gars! Je viens de passer 3 heures à essayer de comprendre ce que je fais de mal. J'essayais de recréer le modèle d'entité, j'ai créé quelques solutions de test ... Et la réponse était simple: NE PAS ÉCRIRE DU CODE DE BASE DE DONNÉES DANS L'ÉVÉNEMENT DE CHARGE DU CONTRÔLE UTILISATEUR! –

0

ce spectacle d'erreur si vous appelez la fonction « LaadCbx() » sur le constructeur de UserControl.

parce que l'initialisation sur le cadre de l'entité existe dans cette fonction.

la solution est d'appeler cette fonction « LaadCbx() » dans le constructeur du formulaire parent.