Creates a SQLite Database from Code, using Entity Framework CodeFirst.
This Project ships several IDbInitializer
which creates a new SQLite Database, based on your model/code.
I started with the code from flaub.
Currently the following 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 convetionForeignKeyIndexConvention
)
I tried to write the code in a extensible way. The logic is divided into two main parts. Builder and Statement. The Builder knows how to translate the EdmModel into statements where a statement class creates the SQLite-DDL-Code. The structure of the statements is influenced by the SQLite Language Specification. You will find an extensive usage of the composite pattern.
Either get the assembly from the latest GitHub Release Page or install the NuGet-Package SQLite.CodeFirst (PM> Install-Package SQLite.CodeFirst
).
The project is builded for the target frameworks 4.0 and 4.5. That means you can use the SQLite CodeFirst in projects with the following target frameworks.
- .NET 4.0 (use net40)
- .NET 4.5 (use net45)
- .NET 4.5.1 (use net45)
- .NET 4.5.2 (use net45)
If you want to let the Entity Framework create the database, if it does not exist, just set SqliteDropCreateDatabaseAlways<>
or SqliteCreateDatabaseIfNotExists<>
as your IDbInitializer<>
.
public class MyDbContext : DbContext
{
public MyDbContext()
: base("ConnectionStringName") { }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyDbContext>(
Database.Connection.ConnectionString, modelBuilder);
Database.SetInitializer(sqliteConnectionInitializer);
}
}
In a more advanced scenario you may want to populate some core- or test-data after the database was created.
To do this, inherit from SqliteDropCreateDatabaseAlways<>
or SqliteCreateDatabaseIfNotExists<>
and override the Seed(MyDbContext context)
function.
This function will be called, in a own transaction, right after the database was created. This function is only executed if a new database was successfully created.
public class MyDbContextContextInitializer : SqliteDropCreateDatabaseAlways<MyDbContext>
{
public MyDbContextInitializer(string connectionString, DbModelBuilder modelBuilder)
: base(connectionString, modelBuilder) { }
protected override void Seed(MyDbContext context)
{
context.Set<Player>().Add(new Player());
}
}
If you try to reinstall the NuGet-Packages (e.g. if you want to downgrade to .NET 4.0) the app.config will be overwritten and you may getting an exception when you try to run the console project. In this case please check the following issue: msallin#13.