Kurse:Entity Framework Core
Entity Framework Core (EF Core) Spickzettel
Was ist EF Core?
- EF Core ist ein moderner, leichter und erweiterbarer Object-Relational Mapper (ORM) für .NET.
- Erlaubt die Arbeit mit Datenbankdaten als .NET-Objekte (Entities), anstatt mit SQL-Queries.
Grundkonzepte
- Entities: C#-Klassen, die Datenbanktabellen repräsentieren.
- DbContext: Brücke zwischen Entities und Datenbank.
- DbSet<TEntity>: Sammlung einer Entität (Tabelle).
Beispiel: Entities und DbContext
public class Country
{
public int CountryID { get; set; }
public string CountryName { get; set; }
public ICollection<Person> Persons { get; set; }
}
public class Person
{
public int PersonID { get; set; }
public string PersonName { get; set; }
public int CountryID { get; set; }
public Country Country { get; set; }
}
public class PersonsDbContext : DbContext
{
public DbSet<Country> Countries { get; set; }
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Country>().ToTable("Countries");
modelBuilder.Entity<Person>().ToTable("Persons");
}
}
Wichtige NuGet-Pakete
Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServer(oder Sqlite, Npgsql etc.)Microsoft.EntityFrameworkCore.Tools
Verbindung zur Datenbank
// In Program.cs oder Startup.cs
builder.Services.AddDbContext<PersonsDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=PersonsDatabase;Integrated Security=True;"
}
}
Datenbank initialisieren (Seeding)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Country>().HasData(
new Country { CountryID = 1, CountryName = "Deutschland" }
);
modelBuilder.Entity<Person>().HasData(
new Person { PersonID = 1, PersonName = "Max Mustermann", CountryID = 1 }
);
}
Code First Migration
- Migration erstellen:
dotnet ef migrations add InitialCreate
- Migration anwenden:
dotnet ef database update
CRUD-Operationen mit EF Core
- Create:
var person = new Person { PersonName = "Anna" };
context.Persons.Add(person);
context.SaveChanges();
- Read:
var people = context.Persons.ToList();
var one = context.Persons.FirstOrDefault(p => p.PersonID == 1);
- Update:
var person = context.Persons.Find(1);
person.PersonName = "Maria";
context.SaveChanges();
- Delete:
var person = context.Persons.Find(1);
context.Persons.Remove(person);
context.SaveChanges();
Beziehungen (Relationships)
- One-to-Many: Ein Land hat viele Personen, eine Person gehört zu einem Land.
- Foreign Key wird automatisch erkannt (CountryID in Person).
- Mit Navigation Properties arbeiten.
LINQ-Abfragen
var deutsche = context.Persons.Where(p => p.Country.CountryName == "Deutschland").ToList();
Eager Loading mit Include
var personsWithCountry = context.Persons.Include(p => p.Country).ToList();
Fluent API (Erweiterte Konfiguration)
modelBuilder.Entity<Person>()
.Property(p => p.PersonName)
.IsRequired()
.HasMaxLength(100);
Stored Procedures verwenden
// Select
var result = context.Persons.FromSqlRaw("EXEC GetAllPersons").ToList();
// Insert
context.Database.ExecuteSqlRaw("EXEC InsertPerson @Name", new SqlParameter("@Name", "Max"));
Dateien generieren (PDF/CSV)
- PDF (z.B. mit Rotativa):
return new ViewAsPdf("PersonsPDF", personsList);
- CSV (mit CsvHelper):
using (var writer = new StreamWriter("file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(personsList);
}
Best Practices
- Asynchrone Methoden verwenden:
await context.SaveChangesAsync() - Migrationen immer ins Source Control aufnehmen
- Validierung auf Model- und View-Ebene
- Repository-Pattern für größere Projekte
Interviewfragen-Vorbereitung
- Was ist ein ORM? Wie funktioniert EF Core?
- Unterschied zwischen Code First und Database First?
- Wie werden Beziehungen zwischen Tabellen definiert?
- Wozu dient die Migration?
- Wie funktioniert Change Tracking?
Häufige Fehler
- Vergessen: SaveChanges() oder SaveChangesAsync()
- Falsche/fehlende Navigation Properties
- Verbindungskette falsch/fehlt
- Nicht alle Migrations ausgeführt
Tipp: Für weitere Beispiele siehe offizielle EF Core Dokumentation: https://learn.microsoft.com/de-de/ef/core/