Here is a copy of the presentation I have at the 2008 Christchurch Code Camp. (zipped ppt
One of the key points of the presentation was to cover what LINQ to SQL includes, both out-of-the-box, and with the additions that we have been able to build on top of it at Optimation
. I put together the list that follows from two sources: Ayende's list of 25 things your OR Mapper must do
; plus other things that we found useful. Ayende's points are in normal font; my additions to his is are shown in italics.
Out of the box, you get:
CRUD and querying
Polymorphic queries (single-table inheritance only)
"Dirty Tracking" with ability to return full change set
Loading properties without loading whole object
Safe multi-threading (1 datacontext = 1 user on 1 thread is the general rule of thumb)
Well-defined exception policy
Lifecycle events (create/update etc)
Composite primary keys
Automatic dependency ordering when saving changes
Paging support (via Skip/Take)
Aggregation support (group/max/min etc)
Original value tracking
Property change notifications
Runtime SQL logging
Ability to generate database from object model
Persistence by reachabilty
Enhanced "reflection" via LINQ to SQL MetaModel
With our add-ons to LINQ to SQL you (or at least we ;-) also get
Undo (both to "as fetched" and "current DB state")
Flexible eager load
Test: is this object new?
Check mapping against DB
In-memory savepoints (like DB savepoints, but for in-memory entities which haven't been saved yet)
Proper serialization of entities (none of the usual LINQ to SQL serialization restrictions)
Clone trees of related entities (clone parent with children)
Delete-any-object (even if is a new unsaved one; automatically sever relationships to other objects)
Get data context from object (based on this with only very minor changes)
Get reachable objects (approximates "find me all objects in the datacontext)
You get only limited support for:
Caching at unit-of-work (datacontext) level
Custom field types (limited to built-in types, enums, xml, .Parse()-able strings and binary ISerializable. Here
is the valuable and hard-to-find reference page)
You get no support at all for:
Caching at application-wide level (other than that which is done for you by SQL Server itself)
Cache invalidation policies
Cascading update/delete in object model (must rely on DB to do this instead, if you want it)
All in all, its a fairly strong list. Stronger, I suspect, than many people expect.
As for the rest of the presentation, some of it will make sense from written slides, and some won't ;-) A couple of notes here might help:
- The solution to comments on entity properties, and refreshing the designer, can be found here. It looks real good, although I haven't got round to trying it yet myself.
- Here are the hyperlinks to the change set and association bugs. NOTE: Microsoft have just announced that they will fix the latter in .NET 4.0, which goes to prove that they really are going to include LINQ to SQL fixes in that release.
Using the "mapping checker" code. These three points will help if you want to use it: LinqUtil.GetModel is our wrapper for MappingSource.GetModel() - see later slides for details; LinqUtil.IsMappedType() is our wrapper for calling IsEntity on a metaType returned from the MetaModel; and Uow.All(type) is our wrapper for DataContext.GetTable(type). Simply copy the code, replacing our wrappers as noted above.
That's all for now. As noted in the presentation, please do comment below or email me.