OpenAccess ORM
Download
Report
Transcript OpenAccess ORM
OpenAccess ORM
Modeling, API, tools and best practices
Viktor Zhivkov
Senior Software Developer, OpenAccess ORM
Telerik Software Academy
http://academy.telerik.com
Table of Contents
Hello to OpenAccess
Features
Components
OpenAccess API
Working with LINQ
Bulk Operations
Code generation wizards
2
Supported database servers
SQL Compact
Edition
MS SQL 2000+
Oracle 9+
SQLite
VistaDB
LocalDb
SQL Anywhere
My SQL 5.0+
MariaDb
PostgreSQL
SQL Azure
Firebird
ADS
3
OpenAccess features over EF 5.0
Batch Operations over metadata
Code generation for Services
Runtime model modifications
Build-in validation
framework
.Net 3.5 Framework support
Pessimistic
concurrency control
Level 2 caching
Advanced connection pooling
4
First encounter with OpenAccess
5
Components
Visual
Designer – design surface where you can
compose your data model
Toolbox – contains model building block
–
classes, associations and etc.
Model Explorer – view over the conceptual
data model
Model Schema Explorer – view over the
relational data model
Mapping details editor – tool used to map
domain classes to relational tables
6
First OpenAccess model
DEMO!
7
Model Settings
Model settings dialog
allows you to set up:
Your model, model names, database names,
Code generation options
Runtime configuration, logging, caching,
connection pooling
Schema updates
8
Update from Database
Pull changes made in the database into the
existing conceptual model
DEMO
9
Update Database from Model
Push changes made to the conceptual model to the database in
form of SQL DDL script
DEMO
10
Fluent mapping
Define your model using code-only mapping
Possible
scenarios:
Code-first with lots of manual coding
Database-first with one-time code generation
DEMO
11
What is a model?
Metadata Container
Contains all
required
metadata
that describes
the model,
like:
- Domain
Classes
- Domain
Methods
Class1
Class1
Class2
ClassN
Runtime Configuration
.CS
.CS
.CS
.CS
.CS
.CS
12
What is a model?
Metadata Container
Meta
Persistent
Type:
Describes a
domain class
with all its
properties,
settings and
mappings
Class1
Class1
Class2
ClassN
Runtime Configuration
.CS
.CS
.CS
.CS
.CS
.CS
13
What is a model?
Metadata Container
Class1
Class1
Configuration
of the
runtime, all
switches
available in
Model
Settings
dialog
Class2
ClassN
Runtime Configuration
.CS
.CS
.CS
.CS
.CS
.CS
14
What is a model?
Metadata Container
Class1
Class1
Code file that
defines the
.Net class
representing
the model
(derived from
OpenAccessC
ontext)
Class2
ClassN
Runtime Configuration
.CS
.CS
.CS
.CS
.CS
.CS
15
What is a model?
Metadata Container
Class1
Class1
Plain .Net
class (POCO)
that defines
an entity
(Domain
Class)
Class2
ClassN
Runtime Configuration
.CS
.CS
.CS
.CS
.CS
.CS
16
Model internals - Enhancer
Entities bound to a data context need change
tracking in order to be used in Create, Update,
Delete operations (CUD operations)
Enhancer is the behind the scenes tool that
does that for you with minimum interruption
Uses MSIL code weaving to inject the necessary
code in your types
Required some changes in the default build
process!
17
Enhancer – reflection time
Demo – see the original
code and the
enhanced one side by side
DEMO
18
CRUD Operations
Create
1: new Entity();
2: context.Add();
3: context.SaveChanges();
Read – context.Entities.First(o => o.Id == id);
Update
1: entity.Name = entity.Name + “1”;
2: context.SaveChanges();
Delete
1: context.Remove(entity);
2: context.SaveChanges();
DEMO
19
Entity States
Add()
New
NotManaged
Hollow
SaveChanges()
SaveChanges()
Dirty
Remove()
Load data
Remove()
change
Deleted
Remove()
Attach()
Clean
Detach()
Detached
20
Lazy Loading
Entity properties
are loaded lazily by default!
Simple properties will have their data inmemory
Navigation properties will have the target
entity in Hollow state
DEMO
21
Fetch API
Load related objects eagerly
Different approaches
DEMO
Fetch Strategy – applied to the
OpenAccessContext and used for every delete
that is included in the strategy
Include<T>() – applied to a LINQ query
Optimizes the way data is
loaded – can solve
N+1 loading problems
22
Caching
Two levels of object caching:
Per context (Level 1 Cache) – in memory set of
all loaded entities.
Per database (Level 2 Cache) – in memory set of
all loaded entities across all context instances in
the Application Domain
Also works in web farm scenarios using MSMQ
synchronization
Prepared statement cache for SQL statements
Query cache for LINQ queries
23
Attach/Detach
API for linking an entity to context or breaking
the same link
One entity can be managed by only
one
context at a time
In order to persist an entity it should be
detached
Attached entities are not suited to travel
across application levels or service boundaries
Detached entities can track changes in their
state
24
Best Practices
Use short living
context instances
L1 Cache can grow indefinitely
Entities can be included in wrong transaction
Best – use “using” block
Avoid FlushChanges
Opens transaction and keeps it active until
SaveChanges() or ClearChanges() are called
25
LINQ and OpenAccess
OpenAccess supports almost all of the features of LINQ to SQL and LINQ
to EF
Some differences:
Queries that will be ineffective due client side execution of filters will
throw exception rather than running as it does in EF
Generic property accessors using FieldValue<T>() method
Support for 3 special names to access internal OA properties
Somewhat better DateTime and bitwise operations support
DEMO
26
Dynamic LINQ
String-based
LINQ API that mirrors parts of
the original LINQ API
Useful with UI components that allow
userdefined filtering, sorting and grouping
Used in OpenAccess to query artificial
types
More on ScottGu’s blog
DEMO
27
Common LINQ Mistakes
Calling
.ToList() too early or to hammer out
errors
Using .Net specific or user-defined methods,
types and properties
Missing
FetchStrategy or Include()
Too broad
FetchStrategy
Dispose the context before data
is
materialized
DEMO
28
Important Considerations
Use variables for filter criteria rather than in-place calculated
values or literals and constants
Variables enable OpenAccess to cache
the compiled query and reuse it with different value
the query result
Avoid non-trivial projections. Any return type outside of the
known entity types will cause the result not to be cached.
When tempted to reduce the network traffic by reducing the
number of returned columns consider how this can affect L1
and L2 caches and ideally test the performance with and
without the projection for your whole scenario
29
How to check your queries
Use OpenAccessProfiler
Use openAccessContext.Log
Use IQueryable<T>.ToString()
Use your favorite profiler provided by the
database server vendor
30
Bulk Operations
Update and Delete operations that operate on matching rows
on the server side without loading data in the application’s
memory
Matching rows are defined as the result of a LINQ query
Delete or update operations are performed efficiently on the
database server
Normally a temporary table is used to how some intermediate
data that is required for the operation. The tables is deleted
when the transaction is complete
Behavior is similar to the normal delete and update of entities
using OpenAccess context API
31
Bulk Update
Discount rental cars that are manufactured
before 1990 by 20%:
Context.Cars.Where(c => c.Year < 1990)
.UpdateAll(u => u.Set(c => c.Prize, c => c.Prize * 0,8));
Roughly equivalent in SQL to:
update Cars c set(c.Prize = c.Prize * 0,8) where c.Year < 1990
DEMO
32
Bulk Delete
Remove discontinued products from the
database:
Context.Products.Where(p => p.Discontinued)
.DeleteAll();
DEMO
Roughly equivalent in SQL to:
delete from Products p where p.Discontinued = 1
33
Bulk Operations details
Each operation has its own transaction
separate from the one in the
OpenAccessContext
Bulk operations will invalidate
any cached
instances in the Level 2 Cache. Eviction is done
by type and will affect usually a lot of objects.
A temporary table will be used. Appropriate
permissions are required. If creation of temp
table fails the required temporary data will be
put in memory.
34
Bulk Operation details (2)
Source queries and update descriptors
should
be 100% pushable to the database server
Setting reference navigation
properties is
possible but dangerous
Setting collection navigation
properties is
forbidden
Using symbolic names is
allowed
35
Add OpenAccess Service wizard
Can generated for you an entire service
layer
that exposes your data model in a few clicks
Supports generation of:
Plain WCF services with DTOs
Data Services
Web API
RESTful Collection Services
AtomPub
DEMO
36
Dynamic Data wizard
Can generate for you a Dynamic Data Web
Application that gives you generic interface for
CRUD operations over your data model
DEMO
37
OpenAccess product
Resources
http://www.telerik.com/products/orm.aspx
OpenAccess online documentation
http://www.telerik.com/products/orm/gettingstarted.aspx
OpenAccess Samples Kit
http://www.telerik.com/products/orm/features/sa
mples-kit.aspx
OpenAccess Forum
http://www.telerik.com/community/forums/orm.as
px
38
OpenAccess ORM
Questions?
Exercises
1. Customize code generation
Customize the OpenAccess Code Generation T4
templates so that all the generated classes inherit from a
single non-persistent class. Then generate a model out of
a Northwind database and demonstrate that with the
generated OpenAccessContext and persistent classes you
are able to retrieve and update data in a small console
application (under the same solution but in a separate
project).
40
Exercises
2. Implement entity cloning using binary
serialization
Define a function that can clone single entity
loaded from the database (for more fame – a
graph of entities, starting with from one of the
nodes). Test that all properties of the original
instance have the same values as the ones on the
cloned.
41
Exercises
3. Compare Bulk Delete with normal delete
operation
Insert 100 000 entities in single table. Delete each row that has ID
where ID mod 7 == 1
Once delete the entities using OpenAccessContext.Remove()
method.
Then delete the entities using DeleteAll() bulk operation.
Both times track the SQL statements that are sent to the server.
Both times measure the time required to complete the
operation(s). For bonus points measure the memory consumption
in addition to the time. Output the measurements in text file
including timestamp and machine name
42
Exercises
4. Do code review of the code generated by Add
OpenAccess Service wizard for Web API services
Make critical code review (peer review) of the code generated by
Add OpenAccess Service wizard for Web API services: Base
controller, Concrete controllers, Base repository, Concrete repositories,
Global asax routes definition
Watch for bad practices in handling data-related task, bad design
decisions, incorrect implementation of design patterns, code
smells, bad code formatting, inefficient code and etc. List at least 3
issues with the generated code.
43
Exercises
5. List 5 suggestions for improvements all over
OpenAccess (issues described in Exercise 4 do
not count!).
Issues can be anything that made working with
OpenAccess unpleasant – bugs, missing
documentation, missing features, bad menu
positioning, unexpected outcome, visual glitches…
As with any bug/issue can you define the steps to
reproduce it?
44
Free Trainings @ Telerik Academy
"Web Design with HTML 5, CSS 3 and
JavaScript" course @ Telerik Academy
Telerik Software Academy
academy.telerik.com
Telerik Academy @ Facebook
html5course.telerik.com
facebook.com/TelerikAcademy
Telerik Software Academy Forums
forums.academy.telerik.com