.NET Database Technologies

26
.NET Database Technologies ORM Roundup

Transcript of .NET Database Technologies

Page 1: .NET Database Technologies

.NET Database Technologies

ORM Roundup

Page 2: .NET Database Technologies

Alternatives to Entity Framework

l  Wide range of ORMs for .NET are available l  Range in scope and approach l  Open source and commercial l  Some have included or 3rd party tool support l  From full-featured mappers to simpler “micro-

ORMs” l  Look at some examples and relate these to

data access patterns

9.        ORM  roundup  2    

Page 3: .NET Database Technologies

Full featured ORMs l  Implement Data Mapper pattern, and other

patterns such as Unit of Work, Identity Map, Metadata Mapping, etc.

l  Examples: l  NHibernate l  Telerik OpenAccess l  DataObjects.NET l  LLBL Gen Pro l  LightSpeed l  EntitySpaces

       ORM  roundup  3    

Page 4: .NET Database Technologies

NHibernate

l  Relatively mature technology (~2005) l  Ported from Hibernate ORM for Java which

was released originally in 2001 l  Powerful and flexible, though regarded as

relatively difficult to learn l  Supported by 3rd party design tools such as

LLBL Gen Pro l  Brief overview and some comparisons with EF

follow here

Page 5: .NET Database Technologies

Unit of Work l  Session is roughly equivalent to EF DbContext l  Implements Unit of Work and Identity Map

patterns l  Session instance is created by a Session

Factory object built by reading a configuration l  Session opens a Transaction in which to do

the work l  Common practice to wrap Session in a custom

Unit of Work at a higher level of abstraction

Page 6: .NET Database Technologies

Unit of Work

l  SessionFactory expensive to create, Session inexpensive

l  In web applications, create SessionFactory when application starts, Session created per-request

l  With dependency injection, SessionFactory scope is singleton, defining how object is configured in DI initialisation (see example with StructureMap in references)

       ORM  roundup  6    

Page 7: .NET Database Technologies

Metadata Mapping

l  Mappings are defined in XML files, by annotations or by fluent mapping (Fluent NHibernate)

l  Very powerful and flexible mapping capabilities

l  Detailed control of loading strategies, etc. l  Can map select, update, etc to stored queries l  Configuration (database connection, etc) also

defined in XML files or fluently

Page 8: .NET Database Technologies

Fluent configuration and mapping

       ORM  roundup  8    

Page 9: .NET Database Technologies

NHibernate queries

l  NHibernate can retrieve data and populate objects in the following ways: l  HQL queries l  Criteria queries (Query Object pattern) l  Native SQL queries l  LINQ l  Named queries (HQL or SQL) defined in mapping l  Stored procedures

Page 10: .NET Database Technologies

NHibernate query examples

       ORM  roundup  10    

get by PK

HQL

SQL

Criteria

LINQ

Page 11: .NET Database Technologies

Lazy loading and fetching

l  Lazy loading enabled by default, uses proxies

l  If disabled, NHibernate eager loads related objects

l  Different behaviour from EF which doesn’t load related objects

l  Can control SQL used for loading in mapping with Fetch/Join options

l  Default is select for each loaded property        ORM  roundup  

11    

Page 12: .NET Database Technologies

Lazy loading and fetching

l  Generally best to leave lazy loading on and override fetch behaviour in queries

       ORM  roundup  12    

EmployeeMap - LL on (same as default)

EmployeeMap - LL off, associated Address object will be eager loaded with single SELECT/JOIN

Fetch (not Include) in LINQ overrides default LL for this query

see nhibernate_loading.txt in sample code

Page 13: .NET Database Technologies

FK properties

l  NHibernate does not expect your POCOs to include FK properties

l  Doesn’t allow a field to be mapped as a property and a key

l  In scenario when you want to save a new object associated with an existing object without materialising that object, use Session.Load

l  Creates a proxy object, does not hit database

       ORM  roundup  13    

Page 14: .NET Database Technologies

Load example

       ORM  roundup  14    

creates proxy, object properties would only be retrieved from db if accessed, which they are not in this case

Can also use Load in queries (HQL here)

Page 15: .NET Database Technologies

NHibernate key generation

l  Unlike EF, NHibernate supports a range of algorithms for generating Ids in addition to using Identity columns

l  HiLo l  UUID hex l  UUID string l  GUID l  Application-assigned

       ORM  roundup  15    

Page 16: .NET Database Technologies

NHibernate caching

l  1st level cache l  Per-session (Unit of Work) l  Similar to EF

l  2nd level cache l  Associated with SessionFactory, not session, can

be shared by many sessions l  Requires a cache provider, e.g. Velocity,

Memcached, ASP.NET caching l  No equivalent capability built into EF (but see

references for example implementation)        ORM  roundup  

16    

Page 17: .NET Database Technologies

Active Record l  An object that wraps a row in a database

table or view, encapsulates the database access, and adds domain logic on that data

l  Examples: l  Castle ActiveRecord l  Subsonic

l  No “live” .NET AR projects, but pattern still popular elsewhere, e.g. Ruby

l  Coupling of data and domain logic is an issue for testability

l 

Page 18: .NET Database Technologies

Castle ActiveRecord

l  Part of Castle Project, which also includes Windsor, Dynamic Proxy, etc.

l  Built on top of NHibernate l  Provides a simpler way to use NHibernate l  Still available but now an “archived” project l  Look at it here just to illustrate the pattern

       ORM  roundup  18    

Page 19: .NET Database Technologies

ActiveRecordBase

l  Active record pattern l  instance properties representing a record in the

database l  instance methods acting on that specific record l  static methods acting on all records

l  ActiveRecord implements this through ActiveRecordBase class

l  All persistent classes inherit from it

Page 20: .NET Database Technologies

ActiveRecordBase l  Provides a basic set of storage and retrieval operations l  Persistent classes can implement additional operations

       ORM  roundup  20    

Page 21: .NET Database Technologies

ActiveRecord queries

l  Persistent classes can retrieve data and populate objects in the following ways: l  Calling methods of base class l  Calling methods of base class and use

NHibernate criteria l  Using SimpleQuery class to execute HQL queries

(Hibernate Query Language) l  Native SQL queries (through NHibernate)

Page 22: .NET Database Technologies

Micro ORMs

l  Simpler tools which do not offer the full range of functionality of full-featured ORMs l  Don’t implement Unit of Work, etc.

l  Also don’t have the associated overheads and offer better performance

l  Balance this against the need to do more work in your code in complex scenarios

l  Examples: l  Dapper, PetaPoco, Massive, Simple.Data

       ORM  roundup  22    

Page 23: .NET Database Technologies

Table Data Gateway

l  Micro ORMs adhere to the basic intent, if not the specifics, of this pattern

l  An object that acts as a Gateway to a database table. One instance handles all the rows in the table

l  There is an expectation here that the application objects will be closely aligned with the database structure

       ORM  roundup  23    

Page 24: .NET Database Technologies

Queries and objects

l  Essentially the job these do is to send queries to the database and use the results to instantiate application objects

l  Queries are in many cases SQL strings l  Application objects are POCOs or dynamic

types, e.g. (Dapper)

       ORM  roundup  24    

Product is POCO, but could instead create dynamic type with Query<dynamic>

Page 25: .NET Database Technologies

Queries and objects

l  Simple.Data fairly literally implements Table Data Gateway

l  Provides “gateway” methods which cause SQL to be generated

       ORM  roundup  25    

gateway

results retrieved as POCOs or dynamic types

Page 26: .NET Database Technologies

References l  http://en.wikipedia.org/wiki/List_of_object-

relational_mapping_software#.NET l  http://lostechies.com/jimmybogard/2012/07/20/choosing-

an-orm-strategy/ l  http://blog.pluralsight.com/2012/04/18/and-the-winner-is-

our-net-orm-poll-results/ l  http://nhibernate.hibernatingrhinos.com/28/first-and-

second-level-caching-in-nhibernate l  http://msdn.microsoft.com/en-us/magazine/

hh394143.aspx l  http://angrywelshcoder.blogspot.co.uk/2011/03/

nhibernate-unit-of-work-repository-and.html        ORM  roundup  

26