Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework 6 with SQLite 3 Code First - Won't create tables

Using latest versions of EF6 and SQLite from NuGet. I finally got the app.config file to work after some useful posts on Stackoverflow. Now the problem is that the tables are not being created although the database is.

My app.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> 

My simple test program:

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>();         }     } } 

If I create the table manually the program works fine and the table is updated. If I delete the database, EF creates it but doesn't create the table and the program fails when it attempts to read back the data with an error message that the table does not exist.

Has anyone managed to get Code First working with EF6 yet? Would appreciate help/guidance on this as I'm now completely stuck!!!

Thanks all.

like image 329
user1192887 Avatar asked Mar 04 '14 14:03

user1192887


People also ask

Does Entity Framework work with SQLite?

This database provider allows Entity Framework Core to be used with SQLite. The provider is maintained as part of the Entity Framework Core project.

What are the limitations of SQLite?

An SQLite database is limited in size to 281 terabytes (248 bytes, 256 tibibytes). And even if it could handle larger databases, SQLite stores the entire database in a single disk file and many filesystems limit the maximum size of files to something less than this.


1 Answers

Edit (12.08.2021)

This post/lib is about EF 6 not EF Core. If you use EF Core, code first for SQLite is supported.


Initial (05.04.2015)

I started with the code from fried and created a project which lets you use CodeFirst. The project is available open source on GitHub or as NuGet Package.

If you encounter any problems or miss a feature, feel free to open a new issue on GitHub. Of course PRs are very welcome.

Edit (26.04.2016):

In the meantime I did a lot in this project.

The following (default EF) functionality is supported:

  • Tables from classes (supported annotations: Table)
  • Columns from properties (supported annotations: Column, Key, MaxLength, Required, NotMapped, DatabaseGenerated, Index)
  • PrimaryKey constraint (Key annotation, key composites are supported)
  • ForeignKey constraint (1-n relationships, support for 'Cascade on delete')
  • Not Null constraint
  • Auto increment (an int PrimaryKey will automatically be incremented)
  • Index (Decorate columns with the Index attribute. Indices are automatically created for foreign keys by default. To prevent this you can remove the convetion ForeignKeyIndexConvention)

There are also some features exclusive for SQLite, which are not supported by default:

  • Unique constraint (Decorate columns with the UniqueAttribute, which is part of this library)
  • Collate constraint (Decorate columns with the CollateAttribute, which is part of this library)

There are two ways to use the functionality of this library.

  1. Make use of the DbInitializers:
  • SqliteCreateDatabaseIfNotExists
  • SqliteDropCreateDatabaseAlways
  • SqliteDropCreateDatabaseWhenModelChanges
  1. Get more control by using one of the following two classes:
  • SqliteSqlGenerator (creates the SQL based on a EdmModel)
  • SqliteDatabaseCreator (creates a new SQLite database based on a Database and DbModel)

Edit (30.05.2020 & 20.03.2021): As EF 6 now supports .NET Core 3 and above, I adjusted the library to support .NET Standard 2.1 as well. The following .NET framework versions are supported:

  • .NET 4.0 (uses net40)
  • .NET 4.5-4.8 (uses net45)
  • .NET Core 3.0-3.1 (uses netstandard2.1)
  • .NET 5 (uses netstandard2.1)
like image 184
msallin Avatar answered Oct 04 '22 01:10

msallin