6

Acabo de crear un control de usuario. Este control también hace uso de mi clase Entity Framework estática para cargar dos cuadros combinados. Todo está bien y funciona sin problemas. El diseño y el tiempo de ejecución funcionan. Luego, cuando detengo la aplicación, todos los formularios que contienen mi UserControl ya no funcionan en tiempo de diseño. Yo sólo veo dos errores:EF en un UserControl no puede ver la aplicación.config?

error1: La conexión con nombre especificado no se ha encontrado en la configuración, no destinado a ser utilizado con el proveedor EntityClient, o no válida.

Error 2: La variable ccArtikelVelden no está declarada o nunca fue asignada. (ccArtikelVelde es mi UserControl)

Runtime todo está funcionando

Mi estática clase de 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; 
     } 
    } 
} 

cierta lógica pasando en mi control de usuario para cargar los datos en los cuadros combinados:

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 única manera de hacer que mis formularios funcionen nuevamente, tiempo de diseño, es comentar la parte EF en el UserControl (ver arriba) y reconstruir. Es muy extraño, todo está en el mismo ensamblado, el mismo espacio de nombres (en aras de la simplicidad).

¿Alguien una idea?

+2

Dejé de leer tan pronto como leí las palabras "static Entity Framework class". Para de hacer eso. Ahora. El 'ObjectContext' no está diseñado para ser utilizado de esta manera. – Aaronaught

Respuesta

8

Parece que está ejecutando de alguna manera el código de la base de datos en modo de diseño. Para evitar esto, caza al método de control y causando esto, y usar:

if (DesignMode) 
    return 

Además, es una muy mala idea para almacenar en caché el contexto de base de datos de forma estática. Causará problemas con el subprocesamiento múltiple y también cuando realice inserciones y eliminaciones. El contexto de la base de datos está destinado a ser utilizado para una única "unidad de trabajo", agrega 2 y elimina 3 objetos más y llama al SaveChanges una vez.

+0

Gracias por sus respuestas Estoy a favor de las mejores prácticas y si el uso de la clase estática es una mala práctica, tengo que ver cómo debería hacerlo de otra manera. El problema es que hace algún tiempo recibí un error en el que no podía editar un objeto de otro contexto. Leí en StackOverflow que la creación de una clase estática era una de las soluciones. Es por eso que fui por este enfoque. Tampoco soy un gran admirador de cada vez que necesito acceder a la base de datos, construir una declaración de uso alrededor de mi operación. Soy nuevo en EF, ¡así que cualquier consejo constructivo es más que bienvenido! – Sven

+0

Acabo de probar lo que propusiste pero aún no es bueno. Ahora hice lo siguiente: vacío privado LaadCbx() { if (DesignMode) return; cbxCategorie.DataSource = (desde c en BSManagerData.Entities.Categories select c) .ToList(); cbxCategorie.DisplayMember = "Naam"; cbxCategorie.ValueMember = "Id"; } Sin embargo, cuando intento agregar el control a mi formulario, aparece el siguiente error: http://img716.imageshack.us/img716/6549/eferror.png – Sven

+0

¿Desde dónde llama a LaadCbx()? En caso de que lo esté llamando desde un constructor, intente eliminarlo del constructor del control. Es mejor (no solo para este problema, sino en general) hacer lo mínimo posible en el constructor, especialmente no en las conexiones de base de datos. Debería poder usar un gancho como OnLoad para cargar los datos en su lugar. –

2

que enfrentan el mismo problema,

En mi caso, he añadido algunos códigos de base de datos en caso de carga de control de usuario que estaban usando algunas bibliotecas, las cuales no se han cargado hasta el tiempo de ejecución.

Por lo tanto, es aconsejable no escribir ningún código de base de datos en el evento de carga de control del usuario.

Espero que esto te ayude!

+0

¡Gracias, amigo! Acabo de pasar 3 horas tratando de entender lo que estoy haciendo mal. Estaba tratando de volver a crear el modelo de entidad, creé algunas soluciones de prueba ... Y la respuesta fue simple: NO ESCRIBIR EL CÓDIGO DE LA BASE DE DATOS EN EL CONTROL DE USUARIO ¡CARGAR EL EVENTO! –

0

este error muestra si llama a la función "LaadCbx()" en el constructor de userControl.

porque la inicialización en el marco entidad existe en esta función.

la solución es llamar a esta función "LaadCbx()" en el constructor del formulario principal.

Cuestiones relacionadas