entity-framework - example - sqlite entity framework code first
La base de datos crea primero el modelo de entidad marco 6.1.1 utilizando system.data.sqlite 1.0.93 (6)
Tengo un proyecto que acabo de actualizar usando Nuget. Este marco de entidad actualizado de 6.1 a 6.1.1, y actualizó sqlite a 1.0.93. Quería actualizar mi modelo desde mi última base de datos. Hice los pasos de 1) Modelo de la base de datos 2) Seleccionar la base de datos sqlite 3) Generar
Después de la generación, recibí el siguiente mensaje de error que se muestra a continuación. Tengo instalados los componentes de tiempo de diseño 1.0.93. ¿Alguien sabe exactamente qué está causando este error? Las referencias y versiones del proyecto coinciden con las versiones que se muestran arriba.
Mensaje de error:
Su proyecto hace referencia al último Entity Framework; sin embargo, no se encontró el proveedor de la base de datos de Entity Framework compatible con esta versión para su conexión de datos.
Actualizar:
Terminé instalando 6.1.0 manualmente usando la consola del administrador de paquetes
Install-Package EntityFramework -Version 6.1.0
Luego en mis archivos csporj reemplazando
packages / EntityFramework.6.1.1
con
packages / EntityFramework.6.1.0
Intenté crear EF Designer desde Database y Code First desde Database, pero sigo recibiendo el mismo error.
ACTUALIZAR
He seguido las instrucciones que Tom ha proporcionado, y muchas gracias por tomarse el tiempo para responder en profundidad, se agradece. Pero no puedo hacer que el diseñador de marcos de entidades trabaje con SQLite 1.0.93. Lo que he encontrado:
1) Cuando agrego el origen de datos SQLite desde el menú de herramientas como Tom describe, veo el proveedor de datos SQLite.
2) Pero cuando reinicio Visual Studio, la fuente de datos no está conectada
3) La fuente de datos se puede actualizar y es válida después de reiniciar
4) Agregue nuevo elemento de datos, pero SQLite no aparece como proveedor
He comprobado dos veces el registro y EF6 se adjunta al nombre invariante, las dlls SQLite están registradas en el GAC. Trataré de ver qué más puedo encontrar, pero en este momento no estoy seguro de qué buscar. Como nota al margen, probé dotConnect y tampoco funciona con EF 6.1.1.
Actualización 2
¿Alguien sabe si el Entity Framework Designer tiene una opción de registro para descubrir qué podría estar pasando?
Esto es lo que funcionó para mí:
- tenía Windows 8.1 Pro x64
- tenía VisualStudio 2013 Ultimate Update 4
- instalado http://system.data.sqlite.org/downloads/1.0.94.0/sqlite-netFx451-setup-bundle-x86-2013-1.0.94.0.exe (en GAC, más diseñador)
- EFTools6.1.2ForVS2013.msi instalado desde https://www.microsoft.com/en-us/download/details.aspx?id=40762
- en soluciones / proyectos antiguos o nuevos que apuntan a .NET 4.5.1 y Cualquier CPU instalada a través del paquete NuGet System.Data.SQLite
- agregó un nuevo modelo de la base de datos (no vi el proveedor SQLite aquí hasta que instalé el paquete NuGet dentro del proyecto)
- para acceder a los datos, tuve que reorganizar el
add
yremove
elementos dentro de la etiquetaDbProviderFactories
en la app.config
Entonces los paquetes que tenía eran:
<packages>
<package id="EntityFramework" version="6.1.1" targetFramework="net451" />
<package id="System.Data.SQLite" version="1.0.94.1" targetFramework="net451" />
<package id="System.Data.SQLite.Core" version="1.0.94.0" targetFramework="net451" />
<package id="System.Data.SQLite.EF6" version="1.0.94.0" targetFramework="net451" />
<package id="System.Data.SQLite.Linq" version="1.0.94.1" targetFramework="net451" />
</packages>
y la aplicación.config que funcionó para mí tenía contenido:
<?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>
<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" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.diagnostics>
<sources>
<!-- This section defines the logging configuration for My.Application.Log -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog" />
<!-- Uncomment the below section to write to the Application Event Log -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter" />
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<system.data>
<!--
NOTE: The extra "remove" element below is to prevent the design-time
support components within EF6 from selecting the legacy ADO.NET
provider for SQLite (i.e. the one without any EF6 support). It
appears to only consider the first ADO.NET provider in the list
within the resulting "app.config" or "web.config" file.
-->
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="WorkinDataEntities" connectionString="metadata=res://*/WorkinDataModel.csdl|res://*/WorkinDataModel.ssdl|res://*/WorkinDataModel.msl;provider=System.Data.SQLite.EF6;provider connection string="data source=X:/dev/proj/workin/bin/data.db"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
Como puede ver, de alguna manera, al final, para mí, no fue necesario eliminar "EF6" de invariantName
o eliminar o reorganizar otros proveedores o fábricas de conexiones predeterminadas. No tuve que hacer ningún truco de registro. Reordenar las etiquetas de add
/ remove
(que se agregaron durante la instalación del paquete NuGet System.Data.SQLite 1.0.94.1) en la aplicación del proyecto de inicio, config.config marcó la diferencia.
Después de todo lo anterior, actualicé EntityFramework a 6.1.2 a través de NuGet y tanto la actualización del modelo de la base de datos a través del diseñador y el acceso a los datos en tiempo de ejecución aún funciona.
Finalmente, tengo pasos para agregar consistentemente Sqlite y EF6 a un proyecto:
EF6: versiones 6.0.0 para ser 6.1.3 (actualmente la última versión). System.Data.Sqlite: 1.0.93 - 1.0.95 pero no 1.0.98 (actualmente la última versión).
Para evitar obtener System.Data.Sqlite 1.0.98, no instale usando Nuget Package Manager. Instale manualmente System.Data.Sqlite. Lamentablemente, http://system.data.sqlite.org/ no enumera fácilmente las descargas anteriores.
Utilizo el administrador de paquetes Nuget e instalo EF6 y luego agregué manualmente la biblioteca System.Data.Sqlite. Lo intenté varias veces para usar 1.0.98 pero no puedo
Para mi implementación, estoy trabajando con la base de datos primero y codificando manualmente las clases de datos de la entidad
public partial class MyDbContextEF : DbContext
{
public MyDbContext() : base("name=MyDbContext") { }
public DbSet<DataRecord> DataRecords { get; set; }
}
[Table("TableName")]
public class DataRecord
{
[Key]
public Int64 RowID { get; set; }
public string Name { get; set; }
}
Informé de este problema y está en curso una solución, y parece que hay una solución disponible (no la he probado) http://system.data.sqlite.org/index.html/tktview?name=e634e330a6
Tenía exactamente el mismo problema: el asistente de diseño del modelo no mostraba mi db sqlite en la lista desplegable. Pude resolverlo jugando con la conexión y las tablas sqlite db.
0a) Agregué una conexión a través de Server Explorer a mi archivo sqlite (los servidores y servidores sqlite se mostraron en el nuevo asistente de conexión para Server Explorer pero no mi asistente de modelo de edmx) 0b) En este momento no se mostraba en el Asistente de modelo de edmx todavía, pero se mostró como una Conexión de Datos en el Explorador de Servidor. 1) Agregué una tabla al archivo sqlite. 2) Cerré la conexión al sqlite db a través del Server Explorer 3) Abrí el diseño de mi tabla ficticia om el archivo sqlite a través del Server Explorer (reiniciando así la conexión) 4) Intenté "Actualizar el modelo desde la base de datos ... . "y se mostraba en la lista desplegable
Otro paso que no incluí anteriormente fue crear y eliminar una base de datos del servidor SQL .mdf New Item... > Database Service...
Lo hice poco antes de intentar los pasos anteriores. Supongo que eso no importaría pero nunca se sabe.
No estoy seguro de qué exactamente lo hizo. Parecía una desconexión manual y la reconexión a través del explorador del servidor hizo que VS se "despertara" y mostrara el servidor en la lista. Intente tocar la conexión y tablas un poco para ver si eso despierta algo.
Yo tuve este problema también. La causa fue probablemente que olvidé marcar la casilla de verificación del estudio visual cuando instalé el controlador system.data.sqlite y luego lo instalé con la casilla marcada sin desinstalar primero el controlador system.data.sqlite. Así como lo resolví:
- Desinstale el controlador system.data.sqlite.
- Reiniciar.
- Instale el controlador system.data.sqlite
- Elimine la solución anterior y configúrela de nuevo, tal como lo hizo (podría no ser necesario).
- Agregue el modelo de entidad ADO.NET (la plantilla me faltaba, esta respuesta ayudó con eso )
- La fuente de datos sqlite ahora debería estar disponible.
[ ACTUALIZACIÓN : para una solución más sencilla que funcione con Visual Studio 2013 Update 4 (Pro y Ultimate) y versiones recientes de Sqlite Providers y EF, consulte la solución ''broslav'' publicada a continuación. No sé si funciona con ediciones Express ...]
Ok, esta es una sugerencia. Esto NO funciona para las ediciones de Visual Studio Express. Además, no estoy seguro de cómo hacer que funcione para una actualización de un proyecto existente. Y es un dolor absoluto en el trasero. No he probado si todo es necesario, pero esto debería funcionar:
Primero, NO use el paquete NuGet para SQLite, pero descargue el instalador de ensamblaje desde aquí: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Instale las Configuraciones para el instalador de Windows de 32 bits (.NET Framework 4.5.1): sqlite-netFx451-setup-bundle-x86-2013-1.0.93.0.exe (10.00 MiB) (NO la versión de 64 bits). Este es el único con el diseñador.
Instale y seleccione instalar en el GAC e instale el Diseñador para VS13.
Para lo siguiente, ¡el orden exacto es importante!
Hice un video de estos pasos , ver: http://vimeo.com/103372740
Crea un proyecto en VS13. Apunte la construcción al marco 4.5.1 y x86 explícitamente. Guardar y construir
A continuación, instale el último paquete EF 6 (6.1.1) de NuGet. Guardar y construir
Agregue referencias manualmente a los ensamblados SQLite instalados (incluido el Diseñador), debajo del Administrador de referencias en Assemblies puede encontrar la opción de Extensiones para seleccionar los cuatro ensamblajes agregados en el GAC: System.Data.SQLite Core + Designer + para Entity Framework + for LINQ .. Guardar y construir.
Luego, cree una conexión a su base de datos a través de Connect to Database en Herramientas. Antes de hacer nada más, guarde y cree y luego reinicie Visual Studio. NO HAGA NINGÚN OTRO ASPECTO antes de iniciar el asistente de modelo de datos de entidad de ADO.NET, por lo que NO actualice la conexión de la base de datos.
Agregue un Modelo de datos de entidad ADO.NET, seleccione Generar a partir de la base de datos. Su conexión a la base de datos aparecerá en la lista desplegable. Manténgalo allí, pero seleccione crear una Nueva conexión de todos modos y seleccione exactamente la misma base de datos (como si estuviera creando una nueva conexión). Suena tonto, pero es crucial, mira la imagen a continuación ...
Cuando de hecho agregué un Modelo de Datos de Entidades ADO.NET de esta forma, presenté el molesto error, pero el botón Siguiente es seleccionable y todo funcionó independientemente (increíblemente)!
Diseñador trabaja, recupera datos y escribe datos.
Aunque no he probado la implementación en otra máquina ... Estoy usando Win7 de 64 bits.
ACTUALIZACIÓN CAMBIADA: para obtener la configuración correcta para acceder realmente a la base de datos, debe instalar el paquete System.Data.SQLite.EF6 de NuGet después de hacer todo lo anterior, luego agregue <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
en App.Config y elimine los otros proveedores y elimine todo lo que haya entre <system.data></system.data>
, de lo contrario obtendrás alguna excepción. Pero tenga en cuenta que esto significa que cada vez que desee actualizar el modelo de EDMX, debe cambiar la aplicaciónConfig invariantName = "System.Data.SQLite" a invariantName = "System.Data.SQLite.EF6" y viceversa.
** ¿Esto es ridículo? ¡Sí lo es! Y me dio un gran dolor de cabeza ... **