c# - tutorial - No se ha encontrado ningún proveedor de Entity Framework para el proveedor de ADO.NET con el nombre invariable ''System.Data.SqlClient''.
entity framework visual studio 2017 (9)
Estamos utilizando EntityFramework 6 con Code First. Tenemos una aplicación de consola que no hace referencia a EntityFramework pero lee la cadena de conexión de su App.config. Llama al ensamblado DatabaseInitializationUtilities pasando la cadena de conexión como un parámetro.
DatabaseInitializationUtilities tiene la referencia a EF6 (EntityFramework y EntityFramework.SqlServer). Su App.config es esto:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IAuthentication" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/SecurityServices/Authentication.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAuthentication" contract="SecurityService.IAuthentication" name="BasicHttpBinding_IAuthentication" />
</client>
</system.serviceModel>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
Cuando la ejecución llega a una línea donde DatabaseInitializationUtilities intenta ejecutar un script
context.Database.ExecuteSqlCommand(script.ScriptText)
el error es arrojado:
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. Consulte http://go.microsoft.com/fwlink/?LinkId=260882 para obtener más información.
Creo que el remedio es exactamente lo que tengo en mi archivo de configuración, así que no entiendo el problema.
NOTA: Resharper está alineando el nodo e informando "El elemento ''EntityFramework'' tiene un elemento hijo no válido ''proveedores''. Sin embargo, la sección fue inyectada por NuGet cuando instalé EF6.
¿Algunas ideas?
¿Tiene el ensamblado EntityFramework.SqlServer.dll en su ruta de aplicación? Tuve el mismo problema y después de copiar el dll en la ruta de la aplicación, cada cosa funcionó bien.
Finalmente encontré la respuesta en este blog:
http://robsneuron.blogspot.com/2013/11/entity-framework-upgrade-to-6.html
También tuve este problema. Todo funcionó localmente cuando ejecuté mi .net mvc app pero cuando lo publiqué obtuve este error. El problema fue que tuve que hacer referencia al EntityFrameworl.SqlServer también en mi proyecto web aunque tuve un proyecto separado para Data. Lo extraño es que este error solo se produjo cuando se publicó la aplicación. Este es un error serio probablemente de Microsoft. Usé EF 6.1.1.
Para mí, resultó que mi referencia de proveedor en el archivo web.config era incorrecta. Creo que el paquete nuget podría no incluir correctamente al proveedor.
Reemplacé a mi proveedor con esto y funcionó:
<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>
Esto se debe a que EntityFramework.SqlServer.dll
no se copia en su proyecto. Agregue ese dll y con suerte funcionará. Puede encontrarlo en el proyecto donde agregó el modelo de datos.
La mejor forma de evitar este tipo de problema es incluir la referencia EntityFramework.SqlServer.dll en su proyecto, presionar F4 (en las propiedades) cambiar la propiedad a Copiar a Local = Verdadero, por lo tanto, todas y cada una de las veces cuando publique el aplicación se copiará a la carpeta publicada.
Necesita crear una referencia, por lo que se copiará en la carpeta de depuración. Luego, se puede acceder en tiempo de ejecución.
No copie ningún archivo, solo cree esta referencia:
private volatile Type _dependency;
public MyClass()
{
_dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
Tiendo a agregar EntityFramework al proyecto web, así como también al ensamblado que realmente lo hace referencia.