Webframeworkk/ASP.NET Core/Entity Framework Core: Unterschied zwischen den Versionen
imported>Import Version 200 |
Die Seite wurde neu angelegt: „Dieses Tutorial bietet einen umfassenden Überblick über '''Entity Framework Core (EF Core)''', das moderne, leichtgewichtige und plattformübergreifende Object-Relational Mapper (ORM) Framework für .NET. ---- == 1. Einführung in EF Core == EF Core vereinfacht die Interaktion mit Datenbanken, indem es Ihnen ermöglicht, mit Daten als .NET-Objekte (Entities) zu arbeiten, anstatt rohe SQL-Abfragen zu schreiben. '''Vorteile:''' * '''Produktivität:'''…“ |
||
| Zeile 4: | Zeile 4: | ||
Dieses Tutorial bietet einen umfassenden Überblick über '''Entity Framework Core (EF Core)''', das moderne, leichtgewichtige und plattformübergreifende Object-Relational Mapper (ORM) Framework für .NET. | Dieses Tutorial bietet einen umfassenden Überblick über '''Entity Framework Core (EF Core)''', das moderne, leichtgewichtige und plattformübergreifende Object-Relational Mapper (ORM) Framework für .NET. | ||
---- | |||
== 1. Einführung in EF Core == | == 1. Einführung in EF Core == | ||
EF Core vereinfacht die Interaktion mit Datenbanken, indem es Ihnen ermöglicht, mit Daten als .NET-Objekte (Entities) zu arbeiten, anstatt rohe SQL-Abfragen zu schreiben. | EF Core vereinfacht die Interaktion mit Datenbanken, indem es Ihnen ermöglicht, mit Daten als .NET-Objekte (Entities) zu arbeiten, anstatt rohe SQL-Abfragen zu schreiben. | ||
'''Vorteile:''' | '''Vorteile:''' | ||
* '''Produktivität:''' Weniger Boilerplate-Code für Datenbankoperationen. | * '''Produktivität:''' Weniger Boilerplate-Code für Datenbankoperationen. | ||
* '''Objektorientiert:''' Nutzung vertrauter C#-Konzepte. | * '''Objektorientiert:''' Nutzung vertrauter C#-Konzepte. | ||
| Zeile 19: | Zeile 16: | ||
'''Nachteile:''' | '''Nachteile:''' | ||
* '''Abstraktions-Overhead:''' Kann bei komplexen Abfragen weniger effizient sein als handgeschriebenes SQL. | * '''Abstraktions-Overhead:''' Kann bei komplexen Abfragen weniger effizient sein als handgeschriebenes SQL. | ||
* '''Lernkurve:''' Erfordert Verständnis der internen Funktionsweise für optimale Performance. | * '''Lernkurve:''' Erfordert Verständnis der internen Funktionsweise für optimale Performance. | ||
---- | |||
== 2. Die Architektur: Ein Drei-Schichten-Modell == | == 2. Die Architektur: Ein Drei-Schichten-Modell == | ||
| Zeile 32: | Zeile 27: | ||
# '''Speichermodell (Database Schema):''' Die tatsächliche Struktur in der Datenbank (Tabellen, Spalten, Constraints). | # '''Speichermodell (Database Schema):''' Die tatsächliche Struktur in der Datenbank (Tabellen, Spalten, Constraints). | ||
---- | |||
== 3. DbContext und DbSet == | == 3. DbContext und DbSet == | ||
Der <code>DbContext</code> ist das Herzstück von EF Core. Er fungiert als Sitzung mit der Datenbank. | Der <code>DbContext</code> ist das Herzstück von EF Core. Er fungiert als Sitzung mit der Datenbank. | ||
'''Hauptaufgaben:''' | '''Hauptaufgaben:''' | ||
* Verbindungsmanagement. | * Verbindungsmanagement. | ||
* Änderungsverfolgung (Change Tracking). | * Änderungsverfolgung (Change Tracking). | ||
| Zeile 46: | Zeile 38: | ||
'''Beispiel: PersonsDbContext''' | '''Beispiel: PersonsDbContext''' | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">public class PersonsDbContext : DbContext | public class PersonsDbContext : DbContext | ||
{ | { | ||
public PersonsDbContext(DbContextOptions options) : base(options) { } | public PersonsDbContext(DbContextOptions options) : base(options) { } | ||
| Zeile 60: | Zeile 52: | ||
modelBuilder.Entity<Person>().ToTable("Persons"); | modelBuilder.Entity<Person>().ToTable("Persons"); | ||
} | } | ||
}</syntaxhighlight> | } | ||
</syntaxhighlight> | |||
---- | |||
== 4. Connection Strings == | == 4. Connection Strings == | ||
Connection Strings definieren, wo sich Ihre Datenbank befindet und wie darauf zugegriffen wird. | Connection Strings definieren, wo sich Ihre Datenbank befindet und wie darauf zugegriffen wird. | ||
'''Empfohlener Speicherort:''' <code>appsettings.json</code> | '''Empfohlener Speicherort:''' <code>appsettings.json</code> | ||
<syntaxhighlight lang="json"> | |||
<syntaxhighlight lang="json">{ | { | ||
"ConnectionStrings": { | "ConnectionStrings": { | ||
"DefaultConnection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=PersonsDatabase;Integrated Security=True;" | "DefaultConnection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=PersonsDatabase;Integrated Security=True;" | ||
} | } | ||
}</syntaxhighlight> | } | ||
</syntaxhighlight> | |||
'''Registrierung in <code>Program.cs</code>:''' | '''Registrierung in <code>Program.cs</code>:''' | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">builder.Services.AddDbContext<PersonsDbContext>(options => { | builder.Services.AddDbContext<PersonsDbContext>(options => { | ||
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); | options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); | ||
});</syntaxhighlight> | }); | ||
</syntaxhighlight> | |||
---- | |||
== 5. Entwicklungsansätze == | == 5. Entwicklungsansätze == | ||
* '''Code-First:''' Sie schreiben C#-Klassen, EF Core erstellt die Datenbank. Ideal für neue Projekte. | * '''Code-First:''' Sie schreiben C#-Klassen, EF Core erstellt die Datenbank. Ideal für neue Projekte. | ||
* '''Database-First:''' Sie starten mit einer bestehenden Datenbank, EF Core generiert die Klassen. Ideal für Legacy-Systeme. | * '''Database-First:''' Sie starten mit einer bestehenden Datenbank, EF Core generiert die Klassen. Ideal für Legacy-Systeme. | ||
---- | |||
== 6. Migrationen und Seed-Daten == | == 6. Migrationen und Seed-Daten == | ||
Migrationen ermöglichen es, Schemaänderungen versioniert zu verwalten. | Migrationen ermöglichen es, Schemaänderungen versioniert zu verwalten. | ||
'''Wichtige Befehle (Package Manager Console):''' | '''Wichtige Befehle (Package Manager Console):''' | ||
* <code>Add-Migration InitialCreate</code>: Erstellt ein Skript für die aktuellen Modelländerungen. | * <code>Add-Migration InitialCreate</code>: Erstellt ein Skript für die aktuellen Modelländerungen. | ||
* <code>Update-Database</code>: Wendet die Migrationen auf die Datenbank an. | * <code>Update-Database</code>: Wendet die Migrationen auf die Datenbank an. | ||
'''Seed-Daten (Initialdaten):''' Nutzen Sie <code>HasData</code> in <code>OnModelCreating</code>, um Tabellen vorab zu befüllen (z. B. Länderlisten). | '''Seed-Daten (Initialdaten):''' | ||
Nutzen Sie <code>HasData</code> in <code>OnModelCreating</code>, um Tabellen vorab zu befüllen (z. B. Länderlisten). | |||
<syntaxhighlight lang="csharp">modelBuilder.Entity<Country>().HasData( | <syntaxhighlight lang="csharp"> | ||
modelBuilder.Entity<Country>().HasData( | |||
new Country() { CountryID = Guid.NewGuid(), CountryName = "Deutschland" } | new Country() { CountryID = Guid.NewGuid(), CountryName = "Deutschland" } | ||
);</syntaxhighlight> | ); | ||
</syntaxhighlight> | |||
---- | ---- | ||
== 7. Fluent API vs. Data Annotations == | |||
Während Data Annotations (<code>[Key]</code>, <code>[Required]</code>) einfach sind, bietet die '''Fluent API''' mehr Flexibilität direkt im <code>DbContext</code>. | Während Data Annotations (<code>[Key]</code>, <code>[Required]</code>) einfach sind, bietet die '''Fluent API''' mehr Flexibilität direkt im <code>DbContext</code>. | ||
'''Beispiel Fluent API:''' | '''Beispiel Fluent API:''' | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">modelBuilder.Entity<Person>() | modelBuilder.Entity<Person>() | ||
.Property(p => p.TIN) | .Property(p => p.TIN) | ||
.HasColumnName("TaxIdentificationNumber") | .HasColumnName("TaxIdentificationNumber") | ||
.HasColumnType("varchar(8)") | .HasColumnType("varchar(8)") | ||
.IsRequired();</syntaxhighlight> | .IsRequired(); | ||
</syntaxhighlight> | |||
---- | |||
== 8. CRUD-Operationen im Controller == | == 8. CRUD-Operationen im Controller == | ||
Dank EF Core lassen sich Datenbankzugriffe schlank im Service-Layer implementieren. | Dank EF Core lassen sich Datenbankzugriffe schlank im Service-Layer implementieren. | ||
'''Beispiel: Person hinzufügen (Create)''' | '''Beispiel: Person hinzufügen (Create)''' | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">public async Task<PersonResponse> AddPerson(PersonAddRequest personRequest) | public async Task<PersonResponse> AddPerson(PersonAddRequest personRequest) | ||
{ | { | ||
Person person = personRequest.ToPerson(); | Person person = personRequest.ToPerson(); | ||
| Zeile 137: | Zeile 130: | ||
return person.ToPersonResponse(); | return person.ToPersonResponse(); | ||
}</syntaxhighlight> | } | ||
</syntaxhighlight> | |||
<syntaxhighlight lang="csharp">var persons = await _db.Persons.Include(p => p.Country).ToListAsync();</syntaxhighlight> | '''Eager Loading mit <code>Include()</code>:''' | ||
Um verwandte Daten (z. B. das Land einer Person) sofort mitzuladen: | |||
<syntaxhighlight lang="csharp"> | |||
var persons = await _db.Persons.Include(p => p.Country).ToListAsync(); | |||
</syntaxhighlight> | |||
---- | |||
== 9. Fortgeschrittene Funktionen == | == 9. Fortgeschrittene Funktionen == | ||
'''Stored Procedures''' EF Core erlaubt die Ausführung von Stored Procedures über <code>FromSqlRaw</code> (für Abfragen) oder <code>ExecuteSqlRaw</code> (für Befehle). | '''Stored Procedures''' | ||
EF Core erlaubt die Ausführung von Stored Procedures über <code>FromSqlRaw</code> (für Abfragen) oder <code>ExecuteSqlRaw</code> (für Befehle). | |||
<syntaxhighlight lang="csharp">var persons = _db.Persons.FromSqlRaw("EXECUTE [dbo].[GetAllPersons]").ToList();</syntaxhighlight> | <syntaxhighlight lang="csharp"> | ||
var persons = _db.Persons.FromSqlRaw("EXECUTE [dbo].[GetAllPersons]").ToList(); | |||
</syntaxhighlight> | |||
'''Berichterstellung (PDF & CSV)''' | |||
* '''PDF:''' Mit Bibliotheken wie '''Rotativa''' können Razor-Views direkt als PDF gerendert werden (<code>return new ViewAsPdf(...)</code>). | * '''PDF:''' Mit Bibliotheken wie '''Rotativa''' können Razor-Views direkt als PDF gerendert werden (<code>return new ViewAsPdf(...)</code>). | ||
* '''CSV:''' Mit '''CsvHelper''' können Daten effizient in Streams geschrieben werden. | * '''CSV:''' Mit '''CsvHelper''' können Daten effizient in Streams geschrieben werden. | ||
---- | |||
== 10. Best Practices & Tipps == | |||
== 10. Best Practices & | |||
# '''Asynchrone Programmierung:''' Nutzen Sie immer <code>ToListAsync()</code>, <code>SaveChangesAsync()</code> etc., um die Skalierbarkeit zu erhöhen. | # '''Asynchrone Programmierung:''' Nutzen Sie immer <code>ToListAsync()</code>, <code>SaveChangesAsync()</code> etc., um die Skalierbarkeit zu erhöhen. | ||
# '''Thin Controllers:''' Lagern Sie die EF-Logik in separate Service-Klassen aus. | # '''Thin Controllers:''' Lagern Sie die EF-Logik in separate Service-Klassen aus. | ||
| Zeile 164: | Zeile 161: | ||
# '''Referenzielle Integrität:''' Achten Sie auf Primär- und Fremdschlüssel-Konfigurationen, um Datenkonsistenz zu wahren. | # '''Referenzielle Integrität:''' Achten Sie auf Primär- und Fremdschlüssel-Konfigurationen, um Datenkonsistenz zu wahren. | ||
---- | |||
---- | |||
''Tutorial erstellt für Thorsten - Viel Erfolg bei der Entwicklung mit ASP.NET Core MVC!'' | ''Tutorial erstellt für Thorsten - Viel Erfolg bei der Entwicklung mit ASP.NET Core MVC!'' | ||
---- | ---- | ||
''Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).'' | ''Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).'' | ||
Aktuelle Version vom 26. Februar 2026, 04:37 Uhr
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Dieses Tutorial bietet einen umfassenden Überblick über Entity Framework Core (EF Core), das moderne, leichtgewichtige und plattformübergreifende Object-Relational Mapper (ORM) Framework für .NET.
1. Einführung in EF Core
EF Core vereinfacht die Interaktion mit Datenbanken, indem es Ihnen ermöglicht, mit Daten als .NET-Objekte (Entities) zu arbeiten, anstatt rohe SQL-Abfragen zu schreiben.
Vorteile:
- Produktivität: Weniger Boilerplate-Code für Datenbankoperationen.
- Objektorientiert: Nutzung vertrauter C#-Konzepte.
- Typsicherheit: LINQ-Abfragen werden zur Kompilierzeit geprüft.
- Plattformübergreifend: Unterstützt SQL Server, SQLite, PostgreSQL, MySQL usw.
Nachteile:
- Abstraktions-Overhead: Kann bei komplexen Abfragen weniger effizient sein als handgeschriebenes SQL.
- Lernkurve: Erfordert Verständnis der internen Funktionsweise für optimale Performance.
2. Die Architektur: Ein Drei-Schichten-Modell
- Konzeptionelles Modell (Entity Model): Ihre C#-Klassen, die das Datenbankschema repräsentieren.
- Mapping: Die Brücke zwischen Ihren Klassen und der Datenbank (konfiguriert über Data Annotations oder Fluent API).
- Speichermodell (Database Schema): Die tatsächliche Struktur in der Datenbank (Tabellen, Spalten, Constraints).
3. DbContext und DbSet
Der DbContext ist das Herzstück von EF Core. Er fungiert als Sitzung mit der Datenbank.
Hauptaufgaben:
- Verbindungsmanagement.
- Änderungsverfolgung (Change Tracking).
- Übersetzung von LINQ in SQL.
Beispiel: PersonsDbContext
public class PersonsDbContext : DbContext
{
public PersonsDbContext(DbContextOptions options) : base(options) { }
public DbSet<Country> Countries { get; set; }
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Country>().ToTable("Countries");
modelBuilder.Entity<Person>().ToTable("Persons");
}
}
4. Connection Strings
Connection Strings definieren, wo sich Ihre Datenbank befindet und wie darauf zugegriffen wird.
Empfohlener Speicherort: appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=PersonsDatabase;Integrated Security=True;"
}
}
Registrierung in Program.cs:
builder.Services.AddDbContext<PersonsDbContext>(options => {
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
});
5. Entwicklungsansätze
- Code-First: Sie schreiben C#-Klassen, EF Core erstellt die Datenbank. Ideal für neue Projekte.
- Database-First: Sie starten mit einer bestehenden Datenbank, EF Core generiert die Klassen. Ideal für Legacy-Systeme.
6. Migrationen und Seed-Daten
Migrationen ermöglichen es, Schemaänderungen versioniert zu verwalten.
Wichtige Befehle (Package Manager Console):
Add-Migration InitialCreate: Erstellt ein Skript für die aktuellen Modelländerungen.Update-Database: Wendet die Migrationen auf die Datenbank an.
Seed-Daten (Initialdaten):
Nutzen Sie HasData in OnModelCreating, um Tabellen vorab zu befüllen (z. B. Länderlisten).
modelBuilder.Entity<Country>().HasData(
new Country() { CountryID = Guid.NewGuid(), CountryName = "Deutschland" }
);
7. Fluent API vs. Data Annotations
Während Data Annotations ([Key], [Required]) einfach sind, bietet die Fluent API mehr Flexibilität direkt im DbContext.
Beispiel Fluent API:
modelBuilder.Entity<Person>()
.Property(p => p.TIN)
.HasColumnName("TaxIdentificationNumber")
.HasColumnType("varchar(8)")
.IsRequired();
8. CRUD-Operationen im Controller
Dank EF Core lassen sich Datenbankzugriffe schlank im Service-Layer implementieren.
Beispiel: Person hinzufügen (Create)
public async Task<PersonResponse> AddPerson(PersonAddRequest personRequest)
{
Person person = personRequest.ToPerson();
person.PersonID = Guid.NewGuid();
_db.Persons.Add(person);
await _db.SaveChangesAsync();
return person.ToPersonResponse();
}
Eager Loading mit Include():
Um verwandte Daten (z. B. das Land einer Person) sofort mitzuladen:
var persons = await _db.Persons.Include(p => p.Country).ToListAsync();
9. Fortgeschrittene Funktionen
Stored Procedures
EF Core erlaubt die Ausführung von Stored Procedures über FromSqlRaw (für Abfragen) oder ExecuteSqlRaw (für Befehle).
var persons = _db.Persons.FromSqlRaw("EXECUTE [dbo].[GetAllPersons]").ToList();
Berichterstellung (PDF & CSV)
- PDF: Mit Bibliotheken wie Rotativa können Razor-Views direkt als PDF gerendert werden (
return new ViewAsPdf(...)). - CSV: Mit CsvHelper können Daten effizient in Streams geschrieben werden.
10. Best Practices & Tipps
- Asynchrone Programmierung: Nutzen Sie immer
ToListAsync(),SaveChangesAsync()etc., um die Skalierbarkeit zu erhöhen. - Thin Controllers: Lagern Sie die EF-Logik in separate Service-Klassen aus.
- DTOs nutzen: Verwenden Sie
Request- undResponse-Modelle, um Ihre Datenbank-Entities vor der UI zu verbergen. - Referenzielle Integrität: Achten Sie auf Primär- und Fremdschlüssel-Konfigurationen, um Datenkonsistenz zu wahren.
Tutorial erstellt für Thorsten - Viel Erfolg bei der Entwicklung mit ASP.NET Core MVC!
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).