¿Por qué el compilador solicita referencia a Entity Framework en el proyecto de Interfaz de usuario?

c# entity-framework-6 winforms

Pregunta

Estoy tratando de aprender cómo crear una aplicación Winform C #, que usa EF con patrón de repositorio.

Según tengo entendido, la capa UI debería ser independiente de Entity Framework (usa datos a través del repositorio y no debería importar si hay un Entity framework o cualquier otro proveedor de datos), pero el compilador muestra un error y el proyecto de WinForms no tiene referencia. Entity framework (cuando agrego una referencia a EF, todo funciona bien)

Mensaje de error

No se ha encontrado ningún proveedor de Entity Framework para el proveedor de ADO.NET con el nombre invariable 'System.Data.SqlClient'. Asegúrese de que el proveedor esté registrado en la sección 'entityFramework' del archivo de configuración de la aplicación

¿Por qué el compilador necesita que mi proyecto Winform tenga referencia al marco de Entity?

Código del proyecto Winforms.

    private void MainForm_Load(object sender, EventArgs e)
    {
        //Customer is a POCO class
        using (var customers = new EfRepository<Customer>())
        {
            foreach (var c in customers.All())
            {
                CList.Items.Add(c.CustomerName);
            }
        }
    }

    private void SaveCustomerButton_Click(object sender, EventArgs e)
    {
        var newCustomer=new Customer();
        newCustomer.CustomerName = CName.Text;
        newCustomer.CustomerDescription = CDescription.Text;
        //newCustomer.
        using (var customers = new EfRepository<Customer>())
        {
            customers.Add(newCustomer);
            customers.Commit();
        }
    }

Código del proyecto de repositorio

    private void MainForm_Load(object sender, EventArgs e)
    {
        //Customer is a POCO class
        using (var customers = new EfRepository<Customer>())
        {
            foreach (var c in customers.All())
            {
                CList.Items.Add(c.CustomerName);
            }
        }
    }

    private void SaveCustomerButton_Click(object sender, EventArgs e)
    {
        var newCustomer=new Customer();
        newCustomer.CustomerName = CName.Text;
        newCustomer.CustomerDescription = CDescription.Text;
        //newCustomer.
        using (var customers = new EfRepository<Customer>())
        {
            customers.Add(newCustomer);
            customers.Commit();
        }
    }

Contexto

    private void MainForm_Load(object sender, EventArgs e)
    {
        //Customer is a POCO class
        using (var customers = new EfRepository<Customer>())
        {
            foreach (var c in customers.All())
            {
                CList.Items.Add(c.CustomerName);
            }
        }
    }

    private void SaveCustomerButton_Click(object sender, EventArgs e)
    {
        var newCustomer=new Customer();
        newCustomer.CustomerName = CName.Text;
        newCustomer.CustomerDescription = CDescription.Text;
        //newCustomer.
        using (var customers = new EfRepository<Customer>())
        {
            customers.Add(newCustomer);
            customers.Commit();
        }
    }

[EDITAR]

Agregué app.config (a mi proyecto de interfaz de usuario) con información sobre mi base de datos, pero funciona solo si agrego Entity Framework a mi proyecto de interfaz de usuario, si elimino EF de mi repositorio de proyectos de interfaz de usuario que se conecta a la base de datos no devuelve ningún dato ( no hay error también ...)

Aquí está el contenido de mi app.config:

    private void MainForm_Load(object sender, EventArgs e)
    {
        //Customer is a POCO class
        using (var customers = new EfRepository<Customer>())
        {
            foreach (var c in customers.All())
            {
                CList.Items.Add(c.CustomerName);
            }
        }
    }

    private void SaveCustomerButton_Click(object sender, EventArgs e)
    {
        var newCustomer=new Customer();
        newCustomer.CustomerName = CName.Text;
        newCustomer.CustomerDescription = CDescription.Text;
        //newCustomer.
        using (var customers = new EfRepository<Customer>())
        {
            customers.Add(newCustomer);
            customers.Commit();
        }
    }

Respuesta aceptada

Tiene razón en que sus proyectos de GUI no deberían necesitar los ensamblados de EF directamente. Por supuesto, todavía los cargará a través de su proyecto de Repositorio.

Pero una aplicación utiliza, por defecto, solo 1 archivo de configuración.
Por lo tanto, necesita la configuración de db en app.config, como lo indica el error.

Cuando agregó las librerías EF, probablemente hubo algunos cambios en el archivo de configuración. Tal vez siga funcionando cuando elimines las libs de nuevo.


Respuesta popular

Después de poner el archivo de configuración en la aplicación principal, esto fue lo que resolvió mi problema

 public PSContext() : base() 
        {

            var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
        }

No más errores ...




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué