Tag Archives: EntityFramework

SQLite, EntityFramework und Cascade Delete

SQLite bzw. eine SQLite Datenbank unterstützt, um die referentielle Integrität sicherzustellen, eine das Konstrukt einer Löschweitergabe (“ON DELETE CASCADE” beim erstellen eines Fremdschlüssels).

Während diese Löschweitergabe mit einem Tool z.B. SQLite Studio wie erwartet funktioniert, passiert beim Einsatz des Entity Frameworks nichts.

Die Ursache dieses Verhaltens ist, dass SQLite aus Kompatibilitätsgründen die Foreign Key Constraints ignoriert. Mehr dazu hier.

Man kann, im Falle von ADO.NET bzw. Entity Framework, die Foreign Key Constraints über den Connection String einschalten. Das kann mit dem Flag “foreign keys=true” gemacht werden.

Hier ein Beispiel, eines ConnectionStrings, ohne das entsprechende Flag:

<connectionStrings>
  <add name="ApplicationDbContext" connectionString="data source=|DataDirectory|\data.sqlite3" providerName="System.Data.SQLite" />
</connectionStrings>

Und hier eines mit eingeschaltenen Foreign Key Constraints:

<connectionStrings>
  <add name="ApplicationDbContext" connectionString="data source=|DataDirectory|\data.sqlite3;foreign keys=true" providerName="System.Data.SQLite" />
</connectionStrings>

Entity Framework CodeFirst für SQLite

Der ORM Mapper aus dem Hause Microsoft namens “Entity Framework” unterstützt ein sehr nützliches und häufig verwendetes Feature bzw. Ansatz namens “CodeFirst”.
“CodeFirst” ist nichts anderes als die automatische Generierung einer (SQL)-Datenbank, basierend auf dem geschrieben Code (Model). Dabei wird auf convention over configuration gesetzt und so generiert der folgende Code eine Datenbank mit zwei Tabellen inkl. Primary- und Foreign-Keys.

public class Player
{
	public int Id { get; set; }
	public string FirstName { get; set; }
	public string LastName { get; set; }
	public Team Team { get; set; }
}

public class Team
{
	public int Id { get; set; }
	public string Name { get; set; }
	public ICollection<Player> Players { get; set; }
}

In einem laufenden Projekt, an dem ich mitarbeite, soll eine SQLite Datenbank einsetzt werden.

SQLite ist eine Programmbibliothek, die ein relationales Datenbanksystem enthält. SQLite unterstützt einen Grossteil der im SQL-92-Standard festgelegten SQL-Sprachbefehle. Unter anderem implementiert SQLite Transaktionen, Unterabfragen (subselects), Sichten (views), Trigger und benutzerdefinierte Funktionen.

Quelle: Wikipedia

Der Datenbank Zugriff wird mit dem Entity Framework realisiert. Die Entity Framework Unterstützung für SQLite lässt sich über ein NuGet Package hinzufügen: https://www.nuget.org/packages/System.Data.SQLite.

Leider unterstützt SQLite bzw. das SQLite NuGet-Package den CodeFirst-Ansatz nicht. Über diesen Post bin ich auf ein Stück Code gestossen, dass rudimentär den CodeFirst Ansatz implementiert: https://gist.github.com/flaub/1968486e1b3f2b9fddaf

Da ich für das Projekt noch ein paar weitere Funktionalitäten hinzufügen musste und der Code produktiv eingesetzt wird, habe ich beschlossen ein Refactoring durchzuführen und diesen Code wiederum auf GitHub zu veröffentlichen.

Das Resultat findet sich hier:
SQLite CodeFirst
Was alles unterstützt wird und wie die Library verwendet werden kann, ist im GitHub ReadMe beschrieben: Zum ReadMe.