Entity Framework

Download Report

Transcript Entity Framework

Entity Framework Introduction
1
Outline
Goals of Entity Framework
2
The story so far…
The “Impedance Mismatch”
Relational
Database
Conceptual /
Business Model
(Objects)
Source: Gil Fink http://blogs.microsoft.co.il/blogs/gilf
3
Traditional way....
Make a persistency layer that maps from SQL to OOP
It is a better solution than accessing the db from many
places in the application
But it still can raise some problems, e.g.:
Tight coupling between application and db
(e.g. can not change tables in the db without making
changes to domain classes in the application)
Hard to maintain (e.g. SQL queries, dependent classes
etc. might be spread in many places)
Application and db domains are probably not the same
Etc.
4
ORM’s provides a way to map
ORM is:
• (Wikipedia) A programming technique for converting data
between incompatible type systems (such as DBMS) in
relational databases and object-oriented programming
languages.
• It does the plumbing work for you to aggregate, modify
and save your data back to its storage in Object Oriented
manner (easy to understand, maintain and extend)
Source: Bishoy Demian
5
ORM external tools for .Net (Wikipedia)
NHibernate, open source
.netTiers, open source, based on commercial code
generation tool (Codesmith)
Developer Express, eXpress Persistent Objects (XPO)
LLBLGen, open source drivers, commercial
TierDeveloper, free ORM and code generation tool
Subsonic, open source
Source: Bishoy Demian
6
Entity Framework is also a ORM
Data access framework
Supports data-centric applications and services
Enables programming against a conceptual application
model
Enables independency of any data storage engine or
relational schema
Source: Gil Fink http://blogs.microsoft.co.il/blogs/gilf
7
Programming Against a Model
EF uses a model called an Entity Data Model (EDM)
EDM is a client-side data model
EDM is an abstraction layer on top of the data storage
Remove the pain of
Interacting with the data storage
Translating the data into objects
Source: Gil Fink http://blogs.microsoft.co.il/blogs/gilf
8
Entity Framework in a Nutshell
Goal: Simple and seamless data access for the .NET
platform
Better layering
Better re-use of existing knowledge and assets
EDM – Entity Data Model
An abstract model for defining entities and relationships
Includes schema and mapping
Store Schema Definition (SSDL)
Conceptual Schema Definition (CSDL)
Mapping Schema between the two (MSL)
Entity Framework
An implementation of EDM and an ORM layer on top
A framework for using entities over data
Source: Jeff Derstadt
9
Data Store
The Entity Framework has no knowledge of the database
that stores the data
It connects and interacts with the database through a
provider that is usually declared in the configuration file
As in ADO.NET the providers are supplied by the dbms
vendors
Some supported dbms’es:
SQLServer ;-)
Oracle
MySQL
postgreSQL
db2
...
Source: Jeff Derstadt
10
Getting Started
Database First (VS 2008 and .NET 3.5 SP1)
DB
Model
Design time
Design time
Code
why? it already exists, or you
want low level control over
the database
Model First (VS 2010 and .NET 4.0)
DB
Model
Design time
Design time
Code
why? you want separation
from code and database in a
declarative format
Code First (Entity Framework Feature CTP3)
DB
Model
Runtime
Source: Jeff Derstadt
Runtime
Code
why? primarily focused on
code shape, database is an
implementation detail
11
What’s New in .NET 4.0
Model-first development
Automatic pluralization
Lazy loading
POCO class support
T4 Code Generation
Template customization
ObjectSet/IObjectSet
Foreign keys in models
Virtual SaveChanges
ExecuteStoreQuery
ExecuteStoreCommand
More LINQ operator
support
Source: Jeff Derstadt
There’s more!
Self-tracking entities
SQL generation
improvements
ObjectStateManager
control
WPF designer integration
SPROC import
improvements
Model defined functions
Code-Only development
(Feature CTP)
12
Demo: Database first
How to create an entity model from an existing database
13
Create a new entity model, step 1
Create a class library project
Add new item, select the ADO.NET Entity Data Model
template
14
Create a new entity model, step 2
When database first, select ”Generate From Database”
Select the database connection
Select the database entities that shall be visible
Important: enable Pluralize... and foreign keys
15
Create a new entity model, step 3
Adjust the entities, mapping etc.
16
The Designer Window
Graphical representation of an EDM and its members
Enables adding more features to the model
Enables properties configuration
Enables updating from the data store
Enables model validation
Source: Gil Fink http://blogs.microsoft.co.il/blogs/gilf
17
Entity in the designer
Singularization and pluralization:
The ‘many’ part is named in plural, e.g. Orders
The ‘one’ part is named in single, e.g. Customer
Navigation Properties:
Make it possible to navigate from one entity (in code an
object) to another.
18
The EDM Document consists of 3 parts
The Entity Data Model (EDM) is a schema language for entities.
It allows for the definition of entities, relationships between
entities and logical sets of related entities
Storage Metadata Schema (SSDL) is a formal description of
the database that persists data for an application built on the
Entity Data Model (EDM).
The entities and associations declared in this schema are the
basis for mapping entities and associations in the conceptual
schema to the corresponding entities in the storage model.
Mapping Specification (MSL) is used to connect the types
declared in conceptual schema definition language (CSDL) to
database metadata that persists data.
Conceptual Schema (CSDL) is a design template for the object
model that will be used by applications built on the Entity Data
Model (EDM).
19
The relationships are declared in XML
The output of the designer is an XML document that
consists of 3 parts:
Source: Julia Lerman
20
Code Generation
Entity classes are automatically generated from the EDM
The classes consists primary of properties and events
So it is possible to get and set values, and to get notified
when an event occurs, e.g. an update
21
Use the generated code
You should place the EDM and therefore the generated
code in a class library (dll-assembly).
Then you can access the EDM from your data-tier,
business-tier, persistent-tier, etc.
When you access from another assembly remember to add
a reference to your EDM assembly and to
system.data.entity
And add ‘using’ for your EDM in the code where the context
class is used
The connection string in the app.config must also be in the
app-config for the exe-assembly.
But it is easier to see in a demo 
22
Demo: Access EDM assembly
Access it from a console application
Do a simple LINQ query and write the result on screen
23
Querying the Model
• Queries are built against a data model
• EDM query transform into data storage query
• Query results materialize into model entities
The image is
taken from
Julia Lerman’s
book
Programming
Entity
Framework,
1st Edition
Source: Gil Fink http://blogs.microsoft.co.il/blogs/gilf
Querying
You can query the model in different ways:
Using LINQ
Using Entity SQL
With Object Services
With Entity Client
25
Querying with LINQ
Straight forward LINQ syntax
IntelliSense support
var context = new NWEntities();
var query = from c in context.Customers
where c.Orders.Count()>25
select c;
foreach(Customer c in query)
Console.WriteLine(c.CompanyName);
26
Entity SQL with Object Services
T-SQL-like query language
EF translates Entity SQL into storage-specific queries
Lazy queries
No IntelliSense support
String queryString = @"SELECT VALUE c
FROM Customers AS c
WHERE c.Country='UK'";
var customers = Context.CreateQuery<Customer>(queryString);
foreach (Customer c in customers)
Console.WriteLine(c.CompanyName);
27
Entity SQL with client queries
Works like traditional PODA: Get a set of records from the
data store
E.g. like SQLClient or OracleClient
No IntelliSense support
using (var conn = new EntityConnection("name=NWEntities")) {
conn.Open();
var qStr = @"SELECT VALUE c
FROM Customers AS c
WHERE c.Country='UK'";
var cmd = conn.CreateCommand();
cmd.CommandText = qStr;
using (var rdr = cmd.ExecuteReader()){
while (rdr.Read()){
Console.WriteLine(rdr.GetString(1));
}
}
}
28
Mutation
Changes to entities are stored in memory:
Every entity in ObjectContext has a ObjectStateEntry
ObjectContext uses ObjectStateEntries to track entity
changes
The context.SaveChanges() method is used to update the
database according to ObjectStateEntries
Rollback (in memory) can be done with
context.SaveChanges(false)
The normal mutations insert, update and delete are
possible
29
Insert
Create a new instance (entity) of the class.
Evt. set references to related objects (as normal in oop)
Add the entity to the context.
Console.WriteLine("Create new order");
var order = new Order { CustomerID = "SEVES", EmployeeID = 1 };
context.AddToOrders(order);
context.SaveChanges();
30
Update
Just get a reference to the entity
Make the changes
And call context.SaveChange()
Console.WriteLine("Changing order");
var order = from o in context.Orders
where o.OrderID == 11078
select o;
order.Single().OrderDate = DateTime.Now;
context.SaveChanges();
31
Delete
Get a reference to the entity
Call context.DeleteObject(theEntity)
Call context.SaveChanges()
Console.WriteLine("Deleting order");
var order = from o in context.Orders
where o.OrderID == 11078
select o;
context.DeleteObject(order.Single());
context.SaveChanges();
32
Inheriance
To types of inheriance
Table-per-Hierarchy Inheritance
Table-per-Type Inheritance
These covers two different situations in SQL databases
without O/R
In the first situation you’ll have one ”type table” where
different subtypes are listed.
In the second situation you’ll have a specialized table pr.
type
33
Demo: Table-per-Hierarchy Inheritance
Example based on School database from msdn
Source: http://mosesofegypt.net/post/Inheritance-andAssociations-with-Entity-Framework-Part-1.aspx
34
Demo: Table-per-Type Inheritance
Example based on School database from msdn
Source: http://mosesofegypt.net/post/Inheritance-andAssociations-with-Entity-Framework-Part-2.aspx
35
Association – no need to carry the full load
Fields that are not used so frequently might be extracted to
another entity with a 1-1 relation
36
Get the picture ;-)
//Get photo when needed
AssoEntities assoContext = new AssoEntities();
var employee = (from e in assoContext.Employees
select e).FirstOrDefault();
Console.WriteLine(employee.LastName);
Console.WriteLine(
employee.EmployeePhoto.Photo.Length.ToString());
//Get the photo together with the rest of Employee
AssoEntities assoContext = new AssoEntities();
var employee = (from e in
assoContext.Employees.Include("EmployeePhoto")
select e).FirstOrDefault();
Console.WriteLine(employee.LastName);
Console.WriteLine(
employee.EmployeePhoto.Photo.Length.ToString());
37