SlideShare ist ein Scribd-Unternehmen logo
Entity	Framework	6	hinter	
den	Kulissen
- das	macht	es	wirklich
Dipl.	Inform.	(FH)	André	Krämer,	M.	Sc.
Softwareentwickler,	Trainer	&	Berater
Wer	von	Ihnen	benutzt	das	
Entity	Framework?
Was	ist	das	Entity	Framework?
„Entity	Framework	ist	die	empfohlene	
Datenzugriffstechnologie	von	Microsoft	für	
neue	Anwendungen“
Quelle:	https://msdn.microsoft.com/de-de/data/ef.aspx
Entity	Framework	(EF)	ist	eine	objektrelationale	Zuordnung,	die	
.NET-Entwicklern	über	domänenspezifische	Objekte	die	
Nutzung	relationaler	Daten	ermöglicht.	
Ein	Großteil	des	Datenzugriffscodes,	den	Entwickler	
normalerweise	programmieren,	muss	folglich	nicht	
geschrieben	werden.
Quelle:	https://msdn.microsoft.com/de-de/data/ef.aspx
Entity	Framework	Selbstdarstellung
Das	Entity	Framework	macht	glücklich!
Foto:	©	Rostislav	Sedlacek|	Fotolia.com
Das	Entity	Framework	“schützt“	uns	vor	solchem	
Code
using (connection)
{
SqlCommand command =
new SqlCommand( "SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}t{1}", reader.GetInt32(0), reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
Und	auch	hiervor	....
Werfen	wir	einen	Blick	unter	die	Haube	...
Bild:	©	iStock.com/NinaMalyna
Bild:	©	iStock.com/ThomasTroy
EF6:	wirklich	ein	magisches	Einhorn?
Open	Source
Solution	Struktur
Projekt:	EntityFramework
• Haupt-Assembly des	Entity	Framework
• Beinhaltet	den	Code,	der	zur	Laufzeit	von	den	jeweiligen	
Anwendungen	genutzt	wird
• Code	war	ursprünglich	in	der	System.Data.Entity DLL	des	.NET	
Framework
Primäre	Namespaces im	Projekt	Entity	
Framework
• System.Data.Entity
Public	APIs	(z.	B.	DBContext).	Relativ	„klein“
• System.Data.Entity.Core
Primäre	Code	des	Entity	Framework
• System.Data.Entity.Migrations
Klassen	für	Code	First	Migrations
Projekt:	EntityFramework.SqlServer
• EF	Provider	für	SQL	Server
• Wird	nur	benötigt	wenn	eine	Verbindung	zum	SQL	Server	hergestellt	
wird
EntityFramework.SqlServerCompact.dll
• EF	Provider	für	SQL	Server	Compact
• Wird	nur	benötigt	wenn	eine	Verbindung	zum	SQL	Server	Compact	
hergestellt	wird
EntityFramework.PowerShell
• Powershell Code	für	Migration	Kommandos
• Code	für	die	Manipulation	von	Config Dateien	bei	der	Installation	via	
NuGet
EntityFramework.PowerShell.Utility
• Hilfsassembly zur	Bindung	an	verschiedene	Powershell Versionen
Migrate
• Kommandozeilen	Fassade	für	Migrationen
Tests
Debugging
• EF	Source	Code	herunter	laden
• EntityFramework Solution	in	Visual	Studio	öffnen
• Rebuild auf	Projekt	Entity	Framework	ausführen
• Neues	Projekt	anlegen	und	EF	via	NuGet hinzufügen
• Referenzierte	 Assemblies austauschen
Startup
Erzeugen	eines	Kontext	ohne	weitere	
Operationen
using (var db = new NorthwindDb())
{
}
Erster	Zugriff	(Abfrage	ohne	Ergebnis)
using (var db = new NorthwindDb())
{
db.Shippers
.Where(s => s.ShipperID < 0).ToList();
}
Ergebnis	des	ersten	Zugriff
Ergebnis	des	zweiten	Zugriff
• select cast(serverproperty('EngineEdition') as int)
Werte	von	Engine	Edition
• 1	=	Personal	or Desktop	Engine	(Not	available in	SQL	Server	2005	and
later versions.)
• 2	=	Standard	(This	is returned for Standard,	Web,	and Business	
Intelligence.)	
• 3	=	Enterprise	(This	is returned for Evaluation,	Developer,	 and both
Enterprise	editions.)
• 4	=	Express	(This	is returned for Express,	Express	with Tools	and
Express	with Advanced Services)
• 5	=	SQL	Azure
33https://technet.microsoft.com/en-us/library/ms174396(v=sql.110).aspx
internal static ServerType GetServerType(DbConnection connection)
{
Debug.Assert(connection.State == ConnectionState.Open, "Expected an open connection");
using (var command = connection.CreateCommand())
{
command.CommandText = "select cast(serverproperty('EngineEdition') as int)";
using (
var reader = DbInterception.Dispatch.Command.Reader(command,
new DbCommandInterceptionContext()))
{
reader.Read();
const int sqlAzureEngineEdition = 5;
return reader.GetInt32(0) == sqlAzureEngineEdition ? ServerType.Cloud :
ServerType.OnPremises;
}
}
}
EntityFramework.SqlServerSqlVersionUtils.cs
• select cast(serverproperty('EngineEdition') as int)
• Ermitteln	der	Datenbankedition	(Lokal	oder	Cloud)
• Notwendig	damit	angepasste	SQL	Statements	generiert	
werden	können
EntityFramework.SqlServerSqlServerMigrationSqlGenerator.cs
SELECT Count(*)
FROM INFORMATION_SCHEMA.TABLES AS t
WHERE t.TABLE_SCHEMA + '.' + t.TABLE_NAME IN
('dbo.Categories', 'dbo.Products', 'dbo.Order
Details', 'dbo.Orders', 'dbo.Customers',
'dbo.CustomerDemographics', 'dbo.Employees',
'dbo.Territories', 'dbo.Region', 'dbo.Shippers',
'dbo.Suppliers', 'dbo.CustomerCustomerDemo',
'dbo.EmployeeTerritories')
OR t.TABLE_NAME = 'EdmMetadata'
• Entity	Framework	prüft	ob	es	in	der	verbundenen	DB	überhaupt	
mindestens	eine	passende	Tabelle	zum	Model	gibt
• Falls	nicht,	können	die	Tabellen	automatisch	erstellt	werden
• Die	Tabelle	EdmMetadata ist	ein	Relikt	aus	EF	4.1	und	4.2	Zeiten.
EntityFramework.SqlServerSqlTableExistenceChecker.cs
EntityFrameworkCreateDatabaseIfNotExists`.cs
SELECT [GroupBy1].[A1] AS [C1]
FROM (SELECT COUNT(1) AS [A1]
FROM [dbo].[__MigrationHistory] AS
[Extent1]
WHERE [Extent1].[ContextKey] =
'EFInternals.Db.NorthwindDb‘
---
SELECT [GroupBy1].[A1] AS [C1]
FROM (SELECT COUNT(1) AS [A1]
FROM [dbo].[__MigrationHistory] AS
[Extent1]) AS [GroupBy1]
Prüfung	des	Models	auf	Kompatibilität	zur	
DB
EntityFrameworkMigrationsHistoryHistoryRepository.cs
EntityFrameworkInternalModelCompatibilityChecker.cs
SELECT TOP (1) [Extent1].[Id] AS [Id],
[Extent1].[ModelHash] AS
[ModelHash]
FROM [dbo].[EdmMetadata] AS [Extent1]
ORDER BY [Extent1].[Id] DESC
Prüfung	auf	EF	4.1	und	4.2	Metadaten
EntityFrameworkInternalModelCompatibilityChecker.cs
Was	steht	in	der	Model	Spalte	der	
__MigrationHistory?
Das	serialisierte und	gezippte	EDMX!
Können	wir	das	optimieren?
Im	Fall	von	Code	First	mit	bestehender	Db
public class NorthwindConfiguration : DbConfiguration
{
public NorthwindConfiguration()
{
SetDatabaseInitializer(new
NullDatabaseInitializer<NorthwindDb>());
}
}
View	Generation
• Beim	ersten	Zugriff	erzeugt	das	Entity	Framework	„Mapping	Views“
• „Ausführbare	Darstellung“	der	zuvor	definierten	Entity	und	
Relationship Mappings
• Diese	werden	auf	Basis	des	vorhandenen	Mappings erstellt
• Query	Views	(DB	-->	Conceptual Model)
• Update	Views	(Conceptual Model	->	DB)
• Nach	der	Erstellung	erfolgt	die	Validierung
Nutzung	der	Views	bei	der	Ausführung	von	Abfragen
• Abfrage	und	Mapping	View	werden	kombiniert
• Ergebnis	läuft	durch	den	Plan-Compiler
• Dieser	generiert	SQL
Change	Tracking
using (var db = new NorthwindDb())
{
var shipper = db.Shippers.Find(6);
shipper.Phone =
DateTime.UtcNow.Millisecond.ToString();
db.SaveChanges();
}
Nach	var	shipper	=	db.Shippers.Find(6);
Nach	shipper.Phone=	
DateTime.UtcNow.Millisecond.ToString();
Nach	Zugriff	auf	den	ChangeTracker des	
DBCtx
?
Snapshot	Change	Tracking	und	Detect
Changes
• Das	Entity	Framework	erstellt	einen	Snapshot	des	original	Zustands	
wenn	Objekte	geladen	werden.	Dabei	werden	alle	Property	Werte	
gespeichert
• Beim	Aufruf	von	SaveChanges wird	die	Methode	DetectChanges
aufgerufen
• DetectChanges überprüft	alle	Entitäten	im	Context und	überprüft	
Aktuell	und	Original
• Wurde	ein	FK	geändert	müssen	auch	Beziehungen	aktualisiert	
werden
Dispose
http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext.html
Homepage
andre@andrekraemer.de|	http://andrekraemer.de|	http://andrekraemer.de/blog
Vielen	Dank!
Blog
Xing
Facebook
Twitter
Google+
61
Quellen
• Reducing	Code	First	Database Chatter
• So	you	want	to	contribute	to	EF
• Secrets of detect changes
Sie	haben	ein	Performance	oder	
Speicherproblem	in	Ihrer	Anwendung?	
Im	Rahmen	meiner	Beratertätigkeit	betreue	ich	seit	vielen	Jahren	Kunden	rum	um	die	
Themen	Datenzugriffsperformance,	Anwendungsperformance	und	Memory	Leak
Analysen.
Kommen	Sie	bei	Bedarf	gerne	auf	mich	zu:	
andre@andrekraemer.de |	http://andrekraemer.de
63
Meine	Dienstleistungen
• Schulungen
• ASP.NET	/	JavaScript	/	AngularJS
• Xamarin
• Cordova
• TX	Text	Control
• Infragistics	NetAdvantage
• Team	Foundation	Server
• .NET	Datenzugriff	(Entity	Framework,	NHibernate,	Micro	O/R	Mapper)
• Consulting
• Durchführung	von	Technologieworkshops
• Code- /	Architekturreviews
• Analyse	von	managed Memory	Leaks
• Prototypenentwicklung
• Remote	Entwickler-Support
• Projektbegleitendes	Coaching
• Softwareentwicklung
• Mobile	Apps	(Android,	iOS,	Windows	10,	Windows	8,	Windows	Phone)
• Entwicklung	von	Web-Anwendungen	mit	ASP.NET	und	AngularJS
• Entwicklung	von	Desktop	Anwendungen
64andre@andrekraemer.de|	http://andrekraemer.de|	http://andrekraemer.de/blog |	http://github.com/AndreKraemer

Weitere ähnliche Inhalte

Was ist angesagt? (7)

MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-Programmierer
 
MongoDB Einführung
MongoDB EinführungMongoDB Einführung
MongoDB Einführung
 
MongoDB - Big Data mit Open Source
MongoDB - Big Data mit Open SourceMongoDB - Big Data mit Open Source
MongoDB - Big Data mit Open Source
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Morphia, Spring Data & Co
Morphia, Spring Data & CoMorphia, Spring Data & Co
Morphia, Spring Data & Co
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 

Ähnlich wie Entity Framework hinter den Kulissen

Einführung in .NET
Einführung in .NETEinführung in .NET
Einführung in .NET
Andreas Heil
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
gueste4be40
 

Ähnlich wie Entity Framework hinter den Kulissen (20)

Entity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf CoreEntity Framework Core - Der Umstieg auf Core
Entity Framework Core - Der Umstieg auf Core
 
Typ-sichere DSLs
Typ-sichere DSLsTyp-sichere DSLs
Typ-sichere DSLs
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIY2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIY
 
Einführung in .NET
Einführung in .NETEinführung in .NET
Einführung in .NET
 
".NET und jetzt!" C# in 21 Tagen oder doch besser Best Practices
".NET und jetzt!" C# in 21 Tagen oder doch besser Best Practices".NET und jetzt!" C# in 21 Tagen oder doch besser Best Practices
".NET und jetzt!" C# in 21 Tagen oder doch besser Best Practices
 
JavaFX Real-World Apps
JavaFX Real-World AppsJavaFX Real-World Apps
JavaFX Real-World Apps
 
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015
 
2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache
 
Top 10 Internet Trends 2000
Top 10 Internet Trends 2000Top 10 Internet Trends 2000
Top 10 Internet Trends 2000
 
Top 10 Internet Trends 2001
Top 10 Internet Trends 2001Top 10 Internet Trends 2001
Top 10 Internet Trends 2001
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in Rails
 
profil_2017
profil_2017profil_2017
profil_2017
 
BizSpark goes Cloud
BizSpark goes CloudBizSpark goes Cloud
BizSpark goes Cloud
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit Microservices
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF Rundumschlag
 
imatics FormEngine
imatics FormEngineimatics FormEngine
imatics FormEngine
 
Meet Magento - High performance magento
Meet Magento - High performance magentoMeet Magento - High performance magento
Meet Magento - High performance magento
 

Mehr von André Krämer

Mehr von André Krämer (11)

Xamarin.Forms App in einer Stunde
Xamarin.Forms App in einer StundeXamarin.Forms App in einer Stunde
Xamarin.Forms App in einer Stunde
 
Entwicklung von ASP.NET-Core- und SQL-Server-Anwendungen unter macOS in der P...
Entwicklung von ASP.NET-Core- und SQL-Server-Anwendungen unter macOS in der P...Entwicklung von ASP.NET-Core- und SQL-Server-Anwendungen unter macOS in der P...
Entwicklung von ASP.NET-Core- und SQL-Server-Anwendungen unter macOS in der P...
 
Codewiederverwendung in Xamarin-Apps maximieren
Codewiederverwendung in Xamarin-Apps maximierenCodewiederverwendung in Xamarin-Apps maximieren
Codewiederverwendung in Xamarin-Apps maximieren
 
Einstieg in Xamarin und Xamarin.Forms, DDC 2018
Einstieg in Xamarin und Xamarin.Forms, DDC 2018Einstieg in Xamarin und Xamarin.Forms, DDC 2018
Einstieg in Xamarin und Xamarin.Forms, DDC 2018
 
Xamarin.Forms Workshop, DDC 2018
Xamarin.Forms Workshop, DDC 2018Xamarin.Forms Workshop, DDC 2018
Xamarin.Forms Workshop, DDC 2018
 
Android Apps mit Xamarin entwickeln
Android Apps mit Xamarin entwickelnAndroid Apps mit Xamarin entwickeln
Android Apps mit Xamarin entwickeln
 
Xamarin ohne Mac und Android SDK? - So weit kommen Sie mit dem Xamarin Live P...
Xamarin ohne Mac und Android SDK?- So weit kommen Sie mit dem Xamarin Live P...Xamarin ohne Mac und Android SDK?- So weit kommen Sie mit dem Xamarin Live P...
Xamarin ohne Mac und Android SDK? - So weit kommen Sie mit dem Xamarin Live P...
 
Typische Sicherheitslücken in ASP.NET MVC und Web API Anwendungen
Typische Sicherheitslücken in ASP.NET MVC und Web API AnwendungenTypische Sicherheitslücken in ASP.NET MVC und Web API Anwendungen
Typische Sicherheitslücken in ASP.NET MVC und Web API Anwendungen
 
Lokale Datenhaltung in Xamarin-Apps
Lokale Datenhaltung in Xamarin-AppsLokale Datenhaltung in Xamarin-Apps
Lokale Datenhaltung in Xamarin-Apps
 
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
 
Cross Plattform App Entwicklung mit Visual Studio 2015 (Xamarin und Cordova)
Cross Plattform App Entwicklung mit Visual Studio 2015 (Xamarin und Cordova)Cross Plattform App Entwicklung mit Visual Studio 2015 (Xamarin und Cordova)
Cross Plattform App Entwicklung mit Visual Studio 2015 (Xamarin und Cordova)
 

Entity Framework hinter den Kulissen