Entity Framework “In Code” konfigurieren

Wird das Entity Framework (kurz EF) über NuGet installiert, so werden im “App.config” diverse EF spezifische Konfigurationseinträge angelegt. Es gibt jedoch Szenarien, da sollen diese Konfigurationseinträge nicht im “App.config” oder “Web.config” vorkommen, sondern mittels Code gesetzt werden. Denn die Einträge im “App.config” oder “Web.config” verlangen zwangsläufig eine Referenz auf das EF im jeweiligen Project.

Ein mögliches Szenario ist, dass eine austauschbare Komponente das EF für den Datenzugriff verwendet. Die Komponente selbst soll dann für die Konfiguration des EFs zuständig sein.

Das folgende Bild zeige eine Applikation mit einer 3-Layer Architektur. Der UI-Layer beinhaltet die App.config-Datei. Der Core-Layer enthält sämtliche Bussines Logik. Der Data-Layer ist für den Datenzugriff zuständig und bietet drei Komponenten an. Eine der Komponenten greift auf Webservices zu, einer verwendet einen In Memory Speicher und einer verwendet das Entity Framework für den Zugriff auf eine (SQL) Datenbank. Die drei Komponenten können zur Design- oder Laufzeit ausgetauscht werden (beispielsweise unter Verwendung eines IoC-Containers).

Untitled

Der rote Pfeil “App.config” symbolisiert die nicht gewollte Referenz. Damit diese Referenz verhindert werden kann, wird das EF explizit im Code konfiguriert. Dafür wird eine Klasse erstellt welche von der Klasse “DbConfiguration” ableitet. Diese Konfiguration wird zur Laufzeit vom Entity Framework über Reflection geladen. Sie enthält die Konfiguration welche sich üblicherweise im “App.config” befindet.

Das folgende Code-Beispiel zeigt eine Klasse welche von “DbConfiguration” ableitet und das EF für die Verwendung einer SQLite-Datenbank konfiguriert.

using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.Common;
using System.Data.SQLite;
using System.Data.SQLite.EF6;

namespace Data.SqliteStorage
{
	/// <summary>
	/// Konfiguriert das Entity Framework zur Verwendung mit SQLite.
	/// Diese Klasse wird automatisch instanziiert, weil von sie von <see cref="DbConfiguration"/> abgeleitet ist.
	/// Die Konfiugration stellt sicher, dass keine Anpassungen an einer Web.config oder App.config Datei nötig sind.
	/// </summary>
	public class SqLiteDbConfiguration : DbConfiguration
	{
		private const string DbFileName = "db.sqlite3";

		/// <summary>
		/// Eine <see cref="DbConnection"/> zur SQLite-Datenbank.
		/// </summary>
		/// <value>
		/// Die Connection.
		/// </value>
		public static DbConnection Connection { get; } = new SQLiteConnection(GetConnectionString(), true);

		public SqLiteDbConfiguration()
		{
			// Das Entity Framework wird in dieser Applikation immer mit SQLite benützt
			// Es ist kein Umschalten in der Konfiguration (web.config oder app.config) angedacht.
			SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
			SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
			SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
		}

		private static string GetConnectionString()
		{
			// foreign key=true aktiviert die FK-Constraints
			return "Data Source=" + GetFilePath() + ";foreign keys=true";
		}

		private static string GetFilePath()
		{
			return "|DataDirectory|" + DbFileName;
		}
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *