.net sqlite ef-code-first entity-framework-6 system.data.sqlite

.net - Entity Framework 6 con SQLite 3 Code First-No creará tablas



ef-code-first entity-framework-6 (4)

Usando las últimas versiones de EF6 y SQLite de NuGet. Finalmente obtuve el archivo app.config para que funcione luego de algunas publicaciones útiles sobre Stackoverflow. Ahora el problema es que las tablas no se están creando aunque la base de datos sí lo esté.

Mi aplicación.config:

<?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> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <providers> <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> </providers> </entityFramework> <system.data> <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="MyDBContext" connectionString="Data Source=|DataDirectory|MyDB.sqlite" providerName="System.Data.SQLite" /> </connectionStrings> </configuration>

Mi programa de prueba simple:

class Program { static void Main(string[] args) { using (var db = new MyDBContext()) { db.Notes.Add(new Note { Text = "Hello, world" }); db.Notes.Add(new Note { Text = "A second note" }); db.Notes.Add(new Note { Text = "F Sharp" }); db.SaveChanges(); } using (var db = new MyDBContext()) { foreach (var note in db.Notes) { Console.WriteLine("Note {0} = {1}", note.NoteId, note.Text); } } Console.Write("Press any key . . . "); Console.ReadKey(); } public class Note { public long NoteId { get; set; } public string Text { get; set; } } public class MyDBContext : DbContext { // default constructor should do this automatically but fails in this case public MyDBContext() : base("MyDBContext") { } public DbSet<Note> Notes { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } }

Si creo la tabla manualmente, el programa funciona bien y la tabla se actualiza. Si elimino la base de datos, EF la crea pero no crea la tabla y el programa falla cuando intenta leer los datos con un mensaje de error de que la tabla no existe.

¿Alguien ha logrado que Code First trabaje con EF6 todavía? Agradecería ayuda / orientación sobre esto ya que ahora estoy completamente atascado !!!

Gracias a todos.


Comencé con el código de fried y creé un proyecto que te permite usar CodeFirst. El proyecto está disponible en código abierto en GitHub o como Paquete NuGet .

Si encuentra algún problema o se pierde una característica, no dude en abrir un nuevo problema en GitHub . Por supuesto, los RP son muy bienvenidos.

Editar (26.04.2016):

Mientras tanto, hice mucho en este proyecto.

La siguiente funcionalidad (por defecto EF) es compatible:

  • Tablas de clases (anotaciones compatibles: Tabla)
  • Columnas de propiedades (anotaciones compatibles: columna, clave, longitud máxima, obligatorio, no mapeado, base de datos, índice)
  • Restricción PrimaryKey (se admiten anotaciones clave, compuestos clave)
  • Restricción ForeignKey (relaciones 1-n, soporte para ''Cascade on delete'')
  • No es una restricción nula
  • Incremento automático (una clave principal int se incrementará automáticamente)
  • Índice (Decorar columnas con el atributo Índice. Los índices se crean automáticamente para las claves externas de forma predeterminada. Para evitar esto, puede eliminar la convención ForeignKeyIndexConvention)

También hay algunas funciones exclusivas para SQLite, que no son compatibles por defecto:

  • Restricción única (decorar columnas con UniqueAttribute, que es parte de esta biblioteca)
  • Restricción de clasificación (decorar columnas con CollateAttribute, que es parte de esta biblioteca)

Hay dos formas de usar la funcionalidad de esta biblioteca.

  1. Haga uso de los DbInitializers:

    • SqliteCreateDatabaseIfNotExists
    • SqliteDropCreateDatabaseAlways
    • SqliteDropCreateDatabaseWhenModelChanges
  2. Obtenga más control usando una de las siguientes dos clases:

    • SqliteSqlGenerator (crea el SQL basado en un EdmModel)
    • SqliteDatabaseCreator (crea una nueva base de datos SQLite basada en una base de datos y DbModel)

Decidí escribir mi propio inicializador de base de datos rudimentario para resolver este problema.

Puede consultarlo aquí: https://gist.github.com/flaub/1968486e1b3f2b9fddaf

Es compatible con:

  • Relaciones de muchos a muchos
  • Primeras anotaciones de datos de código como:
    • [Llave]
    • [Necesario]
    • [Índice]
    • [Clave externa]

Desafortunadamente, la implementación del proveedor EF6 en System.Data.SQLite.EF6 no admite la creación de tablas. Descargué el código fuente de SQLite para echar un vistazo pero no pude encontrar nada para crear tablas y migraciones. El proveedor de EF6 es básicamente el mismo que su implementación de Linq, por lo que está dirigido a consultar la base de datos en lugar de modificarla.

Actualmente realizo todo mi trabajo con SQL Server y genero scripts SQL para SQLite usando SQL Server Compact y SQLite Toolbox . Los scripts se pueden ejecutar utilizando un SQLiteCommand para simular migraciones.

Actualizar

En el soporte de EF7 para SQL Server, se ha eliminado el compacto y el equipo de EF está desarrollando un nuevo proveedor para SQLite. El proveedor utilizará el proyecto de contenedor SQLite administrado de Microsoft.Data.SQLite , Microsoft.Data.SQLite lugar del proyecto System.Data.SQLite . Esto también permitirá el uso de EF7 en iOS, Android, Windows Phone / Mobile, Linux, Mac, etc. ya que el contenedor de Microsoft se está desarrollando como una biblioteca portátil.

Todavía está en versión beta, pero puede obtener paquetes nuget de las fuentes de desarrollo ASP.Net en MyGet (desarrollador, master , release ) si desea echar un vistazo. Busque el paquete EntityFramework.SQLite .