Kurse:Entity Framework Core: Unterschied zwischen den Versionen

Aus ahrensburg.city
Zur Navigation springen Zur Suche springen
Die Seite wurde neu angelegt: „= 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ä…“
(kein Unterschied)

Version vom 25. Juni 2025, 12:04 Uhr

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.EntityFrameworkCore
  • Microsoft.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

  1. Migration erstellen:
dotnet ef migrations add InitialCreate
  1. 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/