6

Ho appena creato un controllo utente. Questo controllo utilizza anche la mia classe Entity Framework statica per caricare due caselle combinate. Tutto va bene e funziona senza problemi. Il design e il runtime stanno funzionando. Poi, quando interrompo l'applicazione, tutti i moduli che contengono il mio UserControl non funzionano più in fase di progettazione. Vedo solo due errori:EF in un UserControl non può vedere l'app.config?

Errore1: La connessione specificata non viene trovata nella configurazione, non è destinata a essere utilizzata con il provider EntityClient o non è valida.

Errore 2: La variabile ccArtikelVelden è non dichiarata o non è mai stata assegnata. (ccArtikelVelde è il mio UserControl)

runtime tutto sta ancora lavorando

mio statica classe 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; 
     } 
    } 
} 

Alcuni logica accadendo nella mia UserControl per caricare i dati nelle caselle combinate:

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"; 
} 

L'unico modo per far funzionare nuovamente i moduli, tempo di progettazione, consiste nel commentare la parte EF in UserControl (vedere sopra) e ricostruire. È molto strano, tutto è nello stesso assembly, nello stesso spazio dei nomi (per semplicità).

Qualcuno un'idea?

+2

Ho interrotto la lettura non appena ho letto le parole "classe Entity Framework statica". Smettila. Adesso. 'ObjectContext' non è progettato per essere utilizzato in questo modo. – Aaronaught

risposta

8

Sembra che tu stia eseguendo in qualche modo il codice del database in modalità progettazione. Per evitare questo, dare la caccia il controllo e il metodo causando questo, e utilizzare:

if (DesignMode) 
    return 

Inoltre, è una pessima idea per memorizzare nella cache il contesto di database in modo statico. Ciò causerà problemi con il multithreading e anche quando si eseguono inserimenti ed eliminazioni. Il contesto del database è pensato per essere utilizzato per una singola "unità di lavoro", aggiunge 2 e rimuove altri 3 oggetti e chiama SaveChanges una volta.

+0

Grazie per le vostre risposte Sono tutto per le migliori pratiche e se usare la classe statica è una cattiva pratica, devo vedere come dovrei farlo in un altro modo. Il problema è che ho avuto un errore qualche tempo fa in cui non potevo modificare un oggetto da un altro contesto. Ho letto su StackOverflow che la creazione di una classe statica era una delle soluzioni. Ecco perché sono andato per questo approccio. Inoltre non sono un grande fan di ogni volta quando ho bisogno di accedere al DB, costruisco una dichiarazione usando la mia operazione. Sono nuovo di EF, quindi qualsiasi consiglio costruttivo è più che benvenuto! – Sven

+0

Ho appena provato ciò che mi hai proposto ma non ancora buono. Ora ho fatto quanto segue: vuoto privato LaadCbx() { if (DesignMode) return; cbxCategorie.DataSource = (da c in BSManagerData.Entities.Categories selezionare c) .ToList(); cbxCategorie.DisplayMember = "Naam"; cbxCategorie.ValueMember = "Id"; } Tuttavia, quando provo ad aggiungere il controllo al modulo, viene visualizzato il seguente errore: http://img716.imageshack.us/img716/6549/eferror.png – Sven

+0

Da dove si chiama LaadCbx()? Nel caso in cui lo chiami da un costruttore, prova a rimuoverlo dal costruttore del controllo. È meglio (non solo per questo problema, ma in generale) fare il meno possibile nel costruttore, specialmente le connessioni DB. Dovresti essere in grado di utilizzare un hook come OnLoad per caricare i dati. –

2

Ho affrontato lo stesso problema,

Nel mio caso, ho aggiunto alcuni codici di database in controllo utente evento di carico che stavano usando alcune librerie, che non sono stati caricati fino a runtime.

Pertanto, è consigliabile non scrivere alcun codice di database nell'evento di controllo del controllo utente.

Spero che questo ti aiuti!

+0

Grazie, amico! Ho appena trascorso 3 ore, cercando di capire, cosa sto facendo di sbagliato. Stavo cercando di ricreare il modello di entità, creato alcune soluzioni di test ... E la risposta era semplice: NON SCRIVERE IL CODICE DEL DATABASE NELL'EFFETTO DI CONTROLLO DELL'UTENTE! –

0

questo errore mostra se si chiama la funzione "LaadCbx()" sul costruttore di userControl.

perché l'inizializzazione sul framework entità esiste in questa funzione.

la soluzione è chiamare questa funzione "LaadCbx()" nel costruttore del modulo padre.

Problemi correlati