Zwei Frauen schauen gemeinsam auf einen Bildschirm

Entity Framework – Tipps und Tricks

In diesem Blogbeitrag möchte ich einige Tipps und Tricks rund um Entity Framework mit euch teilen. In allen Beispielen gehen wir vom Code-First Ansatz aus.

 

1. 1-zu-1 Beziehung

Es gibt keine 1-zu-1 Beziehung in Datenbanken. Es gibt lediglich eine 1-zu-0/1 Beziehung. In Entity Framework wird diese Beziehung am besten mit der Fluent-API beschrieben.

public class Employee 
{
    public string Name { get; set; }
    public virtual Address Address { get; set; }    
}
 
public class Address
{
    public string Street { get; set; }
    public string PostCode { get; set; }
    public string City { get; set; }
    public virtual Employee Employee { get; set; }
}

Hier hat jede Datenbank ein Henne-Ei-Problem. Die Objekte können nicht simultan generiert werden und sofort auf das andere Objekt referenzieren.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Address>()
                .HasOptional(e => e.Address) 
                .WithRequired(a => a.Employee); 
}

In diesem Beispiel kann ein Employee eine Address haben, aber ein Address kann nicht ohne Employee existieren.

Anmerkung: Mit Entity Framework kann eine (echte) 1-zu-1 Beziehung vorgetäuscht werden. Für die Datenbank sind diese Felder jedoch keine Pflichtfelder und somit keine echte 1-zu-1 Beziehung.

2. Mehr als eine 1-zu-n Beziehung zwischen zwei Entitäten

In unserem Beispiel gibt es folgende (vereinfachte) Klassen:

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
}

public class Task
{
    public string Title { get; set; }
    public string Body { get; set; }
    public virtual User CreatedBy { get; set; }
}

Daraus resultiert folgende Datenbank:

Screenshot Datenbank mit einer 1-zu-n BeziehungDatenbank mit einer 1-zu-n Beziehung
Datenbank mit einer 1-zu-n Beziehung

Jetzt möchten wir die Klasse Task noch um einen User erweitern, der diese Aufgabe zugewiesen bekommt. Somit hätten wir zwei 1-zu-n Beziehungen zwischen Task und User. Mit Data Annotations lässt sich diese Beziehung einfach realisieren:

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    [InverseProperty(“AssignedTo”)]
    public virtual ICollection<Task> Tasks { get; set; }
}
public class Task
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public virtual User CreatedBy { get; set; }
    public virtual User AssignedTo { get; set; }
}

Daraus resultiert dann folgende Datenbank:

Screenshot Datenbank mit zwei 1-zu-n BeziehungDatenbank mit zwei 1-zu-n Beziehung
Datenbank mit zwei 1-zu-n Beziehung

3. Mit Entity Framework habe ich gar keine Kontrolle über meine Tabellen

Das ist ein hartnäckiges Vorurteil gegenüber Entity Framework, welches aber nicht ganz wahr ist. Wenn eine Zwischentabelle (für eine n-zu-m Beziehung) in Entity Framework erstellt wird, wird die Zwischentabelle mit dem Namen der verbundenen Entitäten erstellt.

public class Employee
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public virtual ICollection<Skill> Skills { get; set; }
}
 
public class Skill
{
    public string Name { get; set; }
    public int Level { get; set; }
    public virtual ICollection<Employee> Employees { get; set; }
}

Daraus kann nun eine EmployeeSkills oder eine SkillEmployees Tabelle entstehen. Die Erstellung dieser Zwischentabelle kann mit der Fluent-API gesteuert werden.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Employee>()
          .HasMany<Skill>(e => e.Skills)
                .WithMany(s => s.Employees)
                .Map(es =>
                {
                    es.MapLeftKey(“EmployeeRefId”);
                    es.MapRightKey(“SkillRefId”);
                    es.ToTable(“EmployeeSkillList”);
                });
}

Die Methoden HasMany() und WithMany() werden zur Konfiguration von n-zu-m Beziehungen verwendet. Danach wird mit der Map() Methode die Tabelle mit dem gewünschten Namen definiert.

Wichtig: Die Entität, aus welcher die HasMany() Methode aufgerufen wird (in unserem Beispiel die Employee Entität), wird mit MapLeftKey() in die „linke Spalte“ geschrieben.

4. SQL + Entity Framework = <3

Eine Kombination aus SQL und Entity Framework ist immer möglich. Die Performance bei komplexen Abfragen mit vielen ungewollten JOINS kann Entity Framework schnell in die Knie zwingen. Eine Kombination aus Entity Framework und einer SQL View kann die Performance enorm anheben. Im nächsten Beispiel haben wir eine sehr simple View, die uns die Namen der Mitarbeiter, deren Skills und deren Skillstufe anzeigt:

CREATE VIEW SkillOverview AS
SELECT E.Firstname as Firstname, E.Lastname as Name, S.Level as Level, S.Name as Skill FROM Employees E
JOIN EmployeeSkillList ESL ON ESL.EmployeeRefId = E.Id
JOIN Skills S ON S.Id = ESL.SkillRefId

Als nächstes erstellen wir ein Datenmodell:

public class SkillOverviewModel
{
    public string Firstname { get; set; }
    public string Name { get; set; }
    public int Level { get; set; }
    public string Skill { get; set; }
}

Nun erstellen wir eine Methode, die uns das Datenmodell anhand der View befüllt:

public ICollection<SkillOverviewModel> GetSkillOverview()
{
    string query = “SELECT * FROM [dbo].[SkillOverview]”;           
    List<SkillOverviewModel> result = this.context.Database.SqlQuery<SkillOverviewModel>
   (query).ToList();
    return result;
}

Mit demselben Prinzip können auch SQL-Functions und Stored Procedures angesprochen werden. Die Parameter werden als SqlParameter Array übergeben. Wenn wir also nur die Mitarbeiter mit einem bestimmten Skill-Level sehen wollen entwickeln wir eine neue Methode:

public ICollection<SkillOverviewModel> GetSkillOverview(int skillLevel)
{
    string query = “SELECT * FROM [dbo].[SkillOverview] WHERE [Level] = @skillLevel”;
    List<object> parameters = new List<object>();
    SqlParameter skillLevelParameter = new SqlParameter(“@skillLevel”, skillLevel);
    parameters.Add(skillLevelParameter);
    List<SkillOverviewModel> result = this.context.Database.SqlQuery<SkillOverviewModel>
          (query, parameters.ToArray()).ToList();
   return result;
}

5. Darf es noch ein wenig mehr sein?

Durch den Code First-Ansatz spiegeln unsere Entitäts-Objekte eine ganze Zeile einer Tabelle ab. In einigen Anwendungen können Entitäten viele Eigenschaften haben, die gar nicht immer benötigt werden.

public class Employee
{
    public int Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public virtual ICollection<Skill> Skills { get; set; }
}

class Program
{
static void Main(string[] args)
{
AppContext context = new AppContext();
List<Employee> employees = context.Employee.ToList();
Console.ReadKey();
}
}​

Diese Abfrage liefert uns nun alle Einträge in der Employee Tabelle. Dadurch wird Id, Firstname und Lastname von jeder Entität geladen. Aber was ist mit den Skills eines Mitarbeiters? Lazy Loading ist standardmäßig aktiviert bei Entity Framework. Dadurch werden die Skills erst dann geladen, wenn diese gebraucht werden.

static void Main(string[] args)
{
    AppContext context = new AppContext();
    List<Employee> employees = context.Employee.ToList();
    foreach(Employee employee in employees)
    {
        Console.WriteLine($”{employee.Firstname} {employee.Lastname}”);
        foreach(Skill employeeSkill in employee.Skills)
        {
            Console.WriteLine($”{employeeSkill.Name}: {employeeSkill.Level}”);
        }
    }
    Console.ReadKey();
}

Alle Employees sind bereits geladen, aber deren Skills leider nicht. Dadurch wird in der inneren foreach-Anweisung jedes Mal ein Request zur Datenbank geschickt und lädt den Skill nach. Besser wäre es, wenn die Skills direkt mit den Employees geladen werden. Mit der Include() Methode lässt sich das einfach realisieren:

List<Employee> employees = context.Employee.Include(e => e.Skills).ToList();

6. Das habe ich doch gar nicht gebraucht!

Wie wir sehen, verwenden wir nur FirstName und LastName von Employee sowie Name und Level von Skill. Mitgeladen wird aber auch jeweils die Id. Unser Beispiel ist etwas “klein”, aber stellen Sie sich vor, Sie haben zwei Entitäten mit verschiedenen Datentypen wie Datum, Integer, Float und davon auch noch viele. Diese werden nicht benötigt, aber auch geladen. In SQL würden wir auch nicht

SELECT * FROM [TABLE] 

ausführen, um dann nur die Daten aus der Menge zu nehmen, die wir brauchen. Wieso sollten wir das dann bei Entity Framework tun?

Unser Ergebnis von der Query kommt wieder in ein Model:

public class FullNameModel
{
    public string FullName { get; }
    public FullNameModel(Employee employee)
    {
        this.FullName = $”{employee.Firstname} {employee.Lastname}”;
    }
}
public ICollection<FullNameModel> GetAllFullNames()
{
    List<FullNameModel> result = this.context.Employee
                                        .Select(x => new FullNameModel
                                        {
                                            FullName = $”{x.Firstname} {x.Lastname}”
                                        }).ToList();
    return result;                                                                                                                                                                                                     }

Übersetzt lautet dieser Code: SELECT Firstname, Lastname FROM [Employees] also genau das, was wir brauchen. Ein Entity Framework Select-Statement mit einem angepasstem Data Transfer Object(DTO) kann genauso schnell sein wie ein direktes SQL Statement.

Wichtig: Im Select-Statement kann nur ein parameterloser Konstruktor verwendet werden.

Fazit

Entity Framework oder SQL? Wieso nicht beides? Entity Framework kann die Arbeit erleichtern, aber nicht alles ist standardmäßig genau so eingestellt, wie der Entwickler es gerade braucht. Durch eine gute Kombination aus Entity Framework und SQL können Schwächen kompensiert und Entwicklungszeit verkürzt werden. Dank Codefirst wird die Datenbankgenerierung in der Codeverwaltung gespeichert und ein Wechsel der Datenbankengine ist einfacher zu realisieren. Der Einsatz von Entity Framework ersetzt nicht das Grundwissen von relationaler Datenmodellierung, sondern sollte diese ergänzen.

novaCapta
Blog
novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Blog

CQRS in ASP.Net MVC mit Entity Framework

Die Entwicklung von Anwendungen in einem mehrschichtigen Aufbau hat sich etabliert. Design Patterns wie MVC schaffen Lösungen.

novaCapta
Michael SonntagBlog
Hands of man using online virtual app on mobile phone. Millennial guy chatting on smartphone, using banking services, reading text message, typing, shopping, making call, browsing internet. Close up
Blog

GraphQL – Die Alternative zu REST

GraphQL ist eine Abfragesprache für APIs zur Ausführung von Abfragen mit Hilfe eines für die Daten definierten Typensystems. In dieser kleinen Blog-Serie schauen wir uns einfache Queries und Mutations an.

novaCapta
Leistung
Zwei Männer am Smartphone
Leistung

Business Productivity Framework

Unser Mittelweg bei der Einführung neuer Software: Business Productivity Framework. Dies ist nichts anderes als die Wiederverwendung von bewährten Architekturen. Individuelle Kundenwünsche lassen sich damit in kürzerer Zeit und ohne hohen Kostenaufwand realisieren.

novaCapta
Lösung
Person in grauen Jeans mit Surface-Gerät
Lösung

Enterprise Application Integration Framework

Eine Mischung an Software-Applikationen, die an unterschiedlichsten Stellen miteinander kommunizieren und gemeinsam Daten nutzen , ist häufig in Unternehmen zu finden. Mit unserem Enterprise Application Integration Framework sorgen Sie für vernetzte Systeme.

novaCapta
Blog
Für versicherungsmathematische Berechnungen, Projektionen, die Gewinnprüfung, stochastische Modellierung und das Asset-Liability-Management ist ein modernes Framework unverzichtbar. Was muss es im Spannungsfeld gesetzlicher und unternehmerischer Hürden leisten? Und was muss aktuarielle Software mitbringen, wenn sie den Herausforderungen von heute und morgen gerecht werden will?
Blog

Eine Frage des Frameworks

Die Digitalisierung macht auch vor der Veränderung aktuarieller Tätigkeiten nicht Halt. Hinzu kommen längst beschlossene gesetzliche Vorgaben, die u.a. IT-Abteilungen vor größte Herausforderungen stellen.

novaCapta
Blog
Close up of female hands while typing on laptop
Blog

SharePoint Framework Client-Side Webparts mit React

React ist ein Framework zum Erstellen von Benutzeroberflächen. In der SharePoint Online Entwicklung bietet es sich für die Entwicklung von Client-Side Webparts an.

novaCapta
Blog
Blue sky and clouds
Blog

Grundlagen der Datenmodellierung

Fachliches Modell mit ER-Diagrammen (auch ERM – Entity Relationship Model)

novaCapta
Blog
News der novaCapta
Blog

Der wiederholte Bereich in Nintex Forms

Nintex für Fortgeschrittene

novaCapta
Blog
Happy male business team leader talking to employees at corporate meeting, discussing work project, sharing jokes, laughing. Positive mentor training diverse group of interns, having fun
Blog

Tipps & Tools für eine erfolgreiche interne Kommunikation

Firmenevents sind für viele Unternehmen ein Highlight, bergen jedoch Herausforderungen für die interne Kommunikation. In unserem Blogbeitrag zeigen wir, wie und mit welchen Tools novaCapta diese Aufgabe gemeistert hat.

novaCapta
Blog
Hands of man using online virtual app on mobile phone. Millennial guy chatting on smartphone, using banking services, reading text message, typing, shopping, making call, browsing internet. Close up
Blog

Handlebars.js – Semantische Template Library

Handlebars.js ist eine Template-Engine für JavaScript. Sie ermöglicht dem Entwickler, mit Hilfe von semantischen Templates Business-Logik und HTML zu trennen.

novaCapta
Julius ElsnerBlog
novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Blog

Nutzung der SharePoint REST API mit Microsoft Flow

Durch Zugriffe über die REST API lassen sich viele Vorgänge mit Microsoft Flow automatisieren.

novaCapta
KnowledgeBase
Frau tippt auf Tablet mit Diagrammen zur Datenanalyse
KnowledgeBase

Executive Dashboard

Mit dem Customer Communication Framework (kurz CCF) auf Basis von Microsoft Teams können Executives in Zukunft sehr direkt und einfach Eskalationen mit Kunden steuern, beheben und kontrollieren. Über die Dashboards stehen Ihnen alle wichtigen Informationen zum Kunden aus unterschiedlichsten Systemen zur Verfügung. Sämtliche Interaktionen und Prozesse des kundenspezifischen Eskalationsmanagements können über eine gemeinsame Oberfläche nachverfolgt werden.

novaCapta
Kathrin HeinrothBlog
novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Blog

Spaltenformatierung in SharePoint: Column formatting vs. JS

Eine Gegenüberstellung der Spaltenformatierung von JSLink zu der neueren Methode Column formating in Office 365.

novaCapta
Thomas KoglerThomas KoglerBlog
News der novaCapta
Blog

Gefilterte Ansicht über Unterschiede in mehreren Spalten

Die Filtermöglichkeiten in Ansichten in SharePoint sind begrenzt. So ist z.B. der direkte Vergleich zwischen zwei Spalten nicht möglich. Möchte ich Unterschiede beim Vergleich zweier Spalten angezeigt bekommen so ist dies nur über einen einzelnen Wertevergleich möglich (Quelle1=“A“ und Kopie1<>“A“). Möchte man dann noch mehrere Spalten miteinander vergleichen wird es schwierig bis unmöglich.

novaCapta
Blog
Hands of man using online virtual app on mobile phone. Millennial guy chatting on smartphone, using banking services, reading text message, typing, shopping, making call, browsing internet. Close up
Blog

Dateizugriffsrechte verwalten mit Microsoft RMS – Teil 2

Dieser Teil der Artikelserie befasst sich mit der Anwendung von den Microsoft RMS in der Praxis.

novaCapta
Blog
Zwei Frauen schauen gemeinsam auf einen Bildschirm
Blog

Fünf Tipps für eine verbesserte Software-Adoption

Die Generation Y stellt im Arbeitsumfeld neue Anforderungen an Unternehmens-Software und -Systeme. Unsere fünf Tipps, um die Adoption einer Software erhöhen.

novaCapta
Blog
novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Blog

Drei Tipps für mehr SharePoint-Begeisterung

Wir geben Tipps zur der Microsoft Serverplattform für Content Management, (Social)-Collaboration, Portalfunktion, Business Intelligence und Enterprise Search.

novaCapta
Blog
Hands of man using online virtual app on mobile phone. Millennial guy chatting on smartphone, using banking services, reading text message, typing, shopping, making call, browsing internet. Close up
Blog

Multi Factor Authentication (Azure und SharePoint)

Microsoft führt mit der Multi Faktor Authentisierung (MFA) eine weitere und kostenlose Authentifizierungsebene zu in Office 365 hinzu.

novaCapta
Blog
novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Blog

Fünf Tipps für mehr SharePoint-Adoption in Unternehmen

SharePoint ist eine vielseitige und mächtige technologische Plattform mit vielen Funktionen. Unseren fünf Expertentipps erhöhen die Adoption.

novaCapta
Leistung
Businessmen use laptops to secure computing through cloud storage for digital business and cloud data processing management. Optimizing online business customer service
Leistung

Azure Cloud-Infrastruktur

Microsoft Azure (PaaS oder IaaS) bietet Ihnen eine optimale technische Grundlage, um individuelle Unternehmensarchitekturen in der Cloud abzubilden. Mit unseren Azure Consulting Services und unserem Azure Landing Zone Ansatz meistern Sie die Reise in die Cloud und optimieren Ihre Geschäftsprozesse.

novaCapta
News
Female student using laptop on desk at library
News

Fachbeitrag der novaCapta: Das personalisierte Intranet

Effektivität erhöhen, Motivation steigern, die Zusammenarbeit fördern: das alles kann ein personalisiertes Intranet leisten. Was dieses ausmacht, erklären Ihnen unsere Experten in unserem Fachbeitrag "Das personalisierte Intranet" im Online Magazin „pressesprecher“.

novaCapta
Leistung
Teamwork of business people work together and combine pieces of gears
Leistung

Multi Cloud Strategie

Wir beraten Sie zu Entwicklung, Implementierung und Betrieb der optimalen (Multi) Cloud Strategie für Ihr Unternehmen und der geeigneten Kombination von Anbietern – ob Microsoft Azure, Amazon Web Services (AWS), IBM Cloud oder Google Cloud (GCP).

novaCapta
Produkt
Drei Personen in einer Besprechung an einem Tisch besprechen den Zeitplan auf ihrem Microsoft-Laptop
Produkt

IT Governance & Lifecycle Management mit novaWorxx

Governance Regeln und IT Prozesse anpassen mit novaWorxx - Für eine erfolgreiche Zusammenarbeit in der Cloud. Schaffen Sie eine zentrale Basis für einen Modern Workplace. Integration in alle Office 365 Anwendungen gewünscht? Auch das bietet novaWorxx. Erfahren Sie jetzt mehr.

novaCapta
News
Close up of female hands while typing on laptop
News

Größere Büroräume in Köln und München

Wir sind umgezogen – und zwar doppelt: Das Kölner und das Münchner Team der novaCapta haben das neue Jahr in neuen Räumlichkeiten gestartet – für noch mehr Wachstum, Innovation und Effizienz.

novaCapta
Blog
Phone lock code. Smartphone protection with 2fa (two factor authentication). Smartphone protection and security with pin number. Encrypted data. Personal online privacy. Cyber hacker threat.
Blog

Interview: Wie Unternehmen Cyber Security herstellen

Unser Kollege Sebastian Nipp leitet nun die Unit Cloud Security & Infrastructure. Im Interview erzählt er, was ihn zum Wechsel bewogen hat, welche Ziele er verfolgt und welche Herausforderungen warten. Besonders im Fokus: Cyber Security.

novaCapta
Blog
Videoserie zur Azure, Teil 3, Cloud Mythos
Blog

Azure Video-Serie: Mythos "Cloud günstiger als On-premises"

Im dritten Teil sind wir dem Mythos "Die Cloud ist immer günstiger als On-Premises" auf der Spur. Warum das so nicht zu 100 Prozent stimmt und was Sie tun können, um die Kosten in der Cloud gering zu halten, erklärt unser Azure Experte.

novaCapta
Leistung
Blue sky and clouds
Leistung

novaCapta Cloud

Mit der novaCapta Cloud werden alle Technologieinvestitionen optimal kombiniert und effektiv eingesetzt. Wir stehen für schnelle Bereitstellung, Berücksichtigung höchster Sicherheitsansprüche, Sicherung des Betrieb und die Verwahrung vertrauliche Daten.

novaCapta
Andy KurzBlog
novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Blog

Warum ist Inline-CSS und JavaScript-Code so schlecht?

Warum der Einsatz von Inline-CSS bzw. JavaScript-Code schlecht ist, da Dinge wie Caching, DRY-Prinzip, Wartbarkeit und Media-Queries gänzlich außer Acht gelassen werden.

novaCapta
Blog
Videoserie zur Azure, Teil 4, Mythos Cloud Provider
Blog

Azure Video-Serie: Mythos "Cloud Provider = Management"

Der Mythos "Der Public Cloud Provider nimmt alle Arbeit ab" hält sich hartnäckig. Unser Azure Experte erklärt, warum das so nicht stimmt, welche Themen beim Wechsel in die Public Cloud relevant sind und was es mit PaaS auf sich hat.

novaCapta
Unternehmen
Blick in die Innenstadt von Fürth
Unternehmen

Fürth

Unser Standort in Fürth

novaCapta
Leistung
novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Leistung

Intranet mit Office 365

Das Intranet ist für viele Mitarbeitende die Tür zu Zusammenarbeit und Vernetzung. Nutzen Sie die Potenziale von Office 365, um die Möglichkeiten voll auszuschöpfen.

novaCapta
Kathrin HeinrothBlog
novaCapta: Ihr Partner für die digitale Transformation mit Microsoft Technologien
Blog

Testen von Angular Anwendungen mit Cypress

Cypress ist ein End-to-End Testing Framework, mit dem man einfache Tests erstellen kann, die in Echtzeit ausgeführt werden. Mit Cypress kann man auch Snapshots von den einzelnen Schritten während der Testausführung sehen. Tests können schnell erstellt werden, ohne dass bestimmte Server oder Driver benötigt werden.