Remove EF dependencies without using the MyConfiguration class

3

I'm trying to create an application by removing all EF dependencies and leaving only the required layers: Repository and Application . I did a little project to test the operation before applying to the actual project to avoid complications, however, the only way I managed to run this project was by using the MyConfiguration class

public class MyConfiguration : DbConfiguration
{
    public MyConfiguration()
    {
        SetProviderServices(
            System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName,
            System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }
}

Is it possible to remove EF dependencies without using this class and without returning the exception?

  

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code Additional   Information: No Entity Framework provider found for ADO.NET   provider with invariant name 'System.Data.SqlClient'. Make sure the   provider is registered in the 'entityFramework' section of the   application config file.

Follow the example code:

Context Class

using MvcNorthwindExemplo.Dominio;
using System.Data.Entity;

namespace MvcNorthwindExemplo.Repositorio
{
    public class DBNorthwindContext : DbContext
    {
        public DBNorthwindContext()
            : base(@"Data Source=(local); Initial Catalog=NorthwindExemplo; Integrated Security=true")
        {            
        }

        public DbSet<Regiao> Regioes { get; set; }
    }
}

Repository layer app.config code

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>

    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

Repository layer package

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net451" />
  <package id="Glimpse" version="1.8.6" targetFramework="net451" />
  <package id="Glimpse.Ado" version="1.7.3" targetFramework="net451" />
  <package id="Glimpse.AspNet" version="1.9.2" targetFramework="net451" />
  <package id="Glimpse.EF6" version="1.6.5" targetFramework="net451" />
  <package id="Glimpse.Mvc5" version="1.5.3" targetFramework="net451" />
</packages>

Application Class

using MvcNorthwindExemplo.Dominio;
using MvcNorthwindExemplo.Repositorio;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;

namespace MvcNorthwindExemplo.Aplicacao
{
    public class RegiaoAplicacao
    {
        public DBNorthwindContext db { get; set; }

    public RegiaoAplicacao()
    {
        db = new DBNorthwindContext();
    }

    public void AddRegiao(Regiao regiao)
    {
        db.Regioes.Add(regiao);
        db.SaveChanges();
    }

    public void UpdateRegiao(Regiao regiao)
    {
        db.Entry(regiao).State = EntityState.Modified;
        db.SaveChanges();
    }

    public void Excluir(long? id)
    {
        var regiao = db.Regioes.Where(r => r.RegiaoID == id).FirstOrDefault();
        if (regiao != null)
        {
            db.Regioes.Remove(regiao);
            db.SaveChanges();
        }
    }

    public Regiao GetRegiaoFind(long id)
    {
        return GetRegiaoAll().Where(r => r.RegiaoID == id).FirstOrDefault();
    }

    public IEnumerable<Regiao> GetRegiaoAll()
    {
        return db.Regioes.ToList();
    }        
}
}

Application Layer.config code

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>

    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

Application layer package

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net451" />
  <package id="Glimpse" version="1.8.6" targetFramework="net451" />
  <package id="Glimpse.Ado" version="1.7.3" targetFramework="net451" />
  <package id="Glimpse.AspNet" version="1.9.2" targetFramework="net451" />
  <package id="Glimpse.EF6" version="1.6.5" targetFramework="net451" />
  <package id="Glimpse.Mvc5" version="1.5.3" targetFramework="net451" />
</packages>
    
asked by anonymous 22.09.2015 / 20:22

1 answer

2

It depends.

The Entity Framework requests at least one data access provider. As in this case you are using SQL Server LocalDb for database access, the Entity Framework needs this dependency with System.Data.SqlClient . If it is another database, of course the provider will be another. Here are sample configurations for other databases:

SQL Server

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

SQL Server LocalDb

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

MySQL

  <entityFramework>
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6"></defaultConnectionFactory>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"></provider>
    </providers>
  </entityFramework>

Oracle

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </providers>
  </entityFramework>

Firebird

<entityFramework>
    <defaultConnectionFactory type="FirebirdSql.Data.EntityFramework6.FbConnectionFactory, EntityFramework.Firebird" />
    <providers>
        <provider invariantName="FirebirdSql.Data.FirebirdClient" type="FirebirdSql.Data.EntityFramework6.FbProviderServices, EntityFramework.Firebird" />
    </providers>
</entityFramework>

PostgreSQL

<entityFramework>
  <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql" />
  <providers>
    <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
  </providers>
<entityFramework>

Now, to make the Entity Framework completely agnostic at startup, you would have to increment your configuration class to receive the provider parameters dynamically.

One suggestion would be:

public class MyConfiguration : DbConfiguration
{
    public MyConfiguration(String providerInvariantName, DbProviderServices dbProviderService)
    {
        SetProviderServices(providerInvariantName, dbProviderService);
    }
}
    
22.09.2015 / 20:54