Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework 7 and SQLite Tables not creating

I've been trying for awhile to figure out how to use a single DBContext to create multiple tables in a Code First fashion without any luck. I'm sure it's just my unfamiliarity with the framework but I'm not sure what I'm missing. Here's a simple example with entities and the 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);
    }
}

It looks to me like it should work, but when I call it in the below code it blows up with a 'no such table: MyEntity' Sqlite exception when hitting the first foreach loop.

static void Main(string[] args)
    {
        using (var db = new MyContext())
        {

            MyEntity testEntity1 = new MyEntity();
            MySecondEntity entity1 = new MySecondEntity();

            testEntity1.MyColumn = "Test Data 1";
            testEntity1.MyNumber = 12345;

            db.MyTable.Add(testEntity1);
            db.Database.Migrate();

            entity1.MyColumn = "New Data 1";
            entity1.MyNumber = 2;

            db.MyTable2.Add(entity1);
            db.Database.Migrate();

            Console.WriteLine("Inserting Data...");

            Console.WriteLine("Data in the Database");

            foreach (var entity in db.MyTable)
            {
                Console.WriteLine("Id: " + entity.Id);
                Console.WriteLine("Column Data: " + entity.MyColumn);
                Console.WriteLine("Number: " + entity.MyNumber);
            }

            foreach (var entity in db.MyTable2)
            {
                Console.WriteLine("Id: " + entity.Id);
                Console.WriteLine("Column Data: " + entity.MyColumn);
                Console.WriteLine("Number: " + entity.MyNumber);
            }
        }

        Console.WriteLine("Examples run finished,press Enter to continue...");
        Console.ReadLine();
    }  

I can almost guarantee it's something simple I'm missing but I just can't seem to find it, and there aren't any examples I can find in their documentation. There seems to be a similar issue submitted on GitHub here https://github.com/aspnet/EntityFramework/issues/2874 but that's for multiple contexts. So maybe this is another piece that just hasn't quite made it to release yet?

Solution

By following the tutorial posted on http://ef.readthedocs.org/en/latest/getting-started/uwp.html as suggested by @natemcmaster and the solution recommended by @lukas-kabrt I was able to get it to work as desired. By running the below commands I was able to get the tables created and insert/select data from them.

Install-Package EntityFramework.Commands –Pre
Add-Migration MyFirstMigration
Update-Database
like image 316
CGideon Avatar asked Feb 09 '23 15:02

CGideon


2 Answers

Check out Getting Started on UWP - EF 7 in the official docs. The following notes are from that document.

The default path on UWP is not writable. Your DB file needs to be in ApplicationData.Current.LocalFolder

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

Also, take note that on UWP you cannot run migrations from commands. You need to run them in the app.

       using (var db = new BloggingContext())
        {
            db.Database.Migrate();
        }
like image 97
natemcmaster Avatar answered Feb 15 '23 11:02

natemcmaster


The DbContext class contains configuration of your database - tables, relationsships, etc. To use the DbContext you need to create a database that matches your DbContext. In the Code-first world, it is done by database migrations.

For ASP.NET 5 you need to add this configuration to your project.json file

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

and then add a migration to your project and apply this migration to the DB by running following commands

dnx ef migrations add MyFirstMigration
dnx ef database update 

For Full .NET you need to run following commands in the Package Manager Console (Tools ‣ NuGet Package Manager ‣ Package Manager Console)

Install-Package EntityFramework.Commands –Pre
Add-Migration MyFirstMigration
Update-Database
like image 38
Lukas Kabrt Avatar answered Feb 15 '23 11:02

Lukas Kabrt