Entity Framework 7 y SQLite Tables no crean

c# entity-framework-core sqlite

Pregunta

Durante un tiempo he intentado descubrir cómo usar un solo DBContext para crear varias tablas de una manera de Code First sin ninguna suerte. Estoy seguro de que es solo mi falta de familiaridad con el marco, pero no estoy seguro de lo que me estoy perdiendo. Aquí hay un ejemplo simple con las entidades y el DBContext.

[Table("MyEntity")]
public class MyEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string MyColumn { get; set; }
    public int MyNumber { get; set; }
}

[Table("MySecondEntity")]
public class MySecondEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string MyColumn { get; set; }
    public int MyNumber { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<MyEntity> MyTable { get; set; }
    public DbSet<MySecondEntity> MyTable2 { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connectionStringBuilder = new SqliteConnectionStringBuilder {DataSource = "test.db"};
        var connectionString = connectionStringBuilder.ToString();
        var connection = new SqliteConnection(connectionString);

        optionsBuilder.UseSqlite(connection);
    }
}

Me parece que debería funcionar, pero cuando lo llamo en el siguiente código, explota con una excepción Sqlite de 'no existe tal tabla: MyEntity' cuando llega al primer bucle foreach.

[Table("MyEntity")]
public class MyEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string MyColumn { get; set; }
    public int MyNumber { get; set; }
}

[Table("MySecondEntity")]
public class MySecondEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string MyColumn { get; set; }
    public int MyNumber { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<MyEntity> MyTable { get; set; }
    public DbSet<MySecondEntity> MyTable2 { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connectionStringBuilder = new SqliteConnectionStringBuilder {DataSource = "test.db"};
        var connectionString = connectionStringBuilder.ToString();
        var connection = new SqliteConnection(connectionString);

        optionsBuilder.UseSqlite(connection);
    }
}

Casi puedo garantizar que es algo simple. Me falta, pero parece que no puedo encontrarlo, y no hay ningún ejemplo que pueda encontrar en su documentación. Parece que hay un problema similar enviado en GitHub aquí https://github.com/aspnet/EntityFramework/issues/2874 pero eso es para múltiples contextos. Entonces, ¿quizás esta es otra pieza que aún no se ha publicado?

Solución

Siguiendo el tutorial publicado en http://ef.readthedocs.org/en/latest/getting-started/uwp.html según lo sugerido por @natemcmaster y la solución recomendada por @ lukas-kabrt, pude hacer que funcionara como deseado. Al ejecutar los siguientes comandos, pude obtener las tablas creadas e insertar / seleccionar datos de ellas.

[Table("MyEntity")]
public class MyEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string MyColumn { get; set; }
    public int MyNumber { get; set; }
}

[Table("MySecondEntity")]
public class MySecondEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string MyColumn { get; set; }
    public int MyNumber { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<MyEntity> MyTable { get; set; }
    public DbSet<MySecondEntity> MyTable2 { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connectionStringBuilder = new SqliteConnectionStringBuilder {DataSource = "test.db"};
        var connectionString = connectionStringBuilder.ToString();
        var connection = new SqliteConnection(connectionString);

        optionsBuilder.UseSqlite(connection);
    }
}

Respuesta aceptada

La clase DbContext contiene la configuración de su base de datos: tablas, relaciones, etc. Para usar DbContext , debe crear una base de datos que coincida con su DbContext . En el mundo de Code-first, se realiza mediante migraciones de base de datos.

Para ASP.NET 5 necesita agregar esta configuración a su archivo project.json

"commands": {
    "ef": "EntityFramework.Commands"
}

y luego agregue una migración a su proyecto y aplique esta migración a la base de datos ejecutando los siguientes comandos

"commands": {
    "ef": "EntityFramework.Commands"
}

Para .NET completo , debe ejecutar los siguientes comandos en la Consola del Administrador de paquetes (Herramientas - NuGet Package Manager - Consola del Administrador de paquetes)

"commands": {
    "ef": "EntityFramework.Commands"
}

Respuesta popular

Echa un vistazo a Getting Started on UWP - EF 7 en los documentos oficiales. Las siguientes notas son de ese documento.

La ruta predeterminada en UWP no se puede escribir. Su archivo DB debe estar en ApplicationData.Current.LocalFolder

options.UseSqlite("Data Source=" + Path.Combine(ApplicationData.Current.LocalFolder.Path, "blogging.db"))

Además, tenga en cuenta que en UWP no puede ejecutar migraciones desde comandos. Necesitas ejecutarlos en la aplicación.

options.UseSqlite("Data Source=" + Path.Combine(ApplicationData.Current.LocalFolder.Path, "blogging.db"))



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é