New Community Website

Ordinarily, you'd be at the right spot, but we've recently launched a brand new community website... For the community, by the community.

Yay... Take Me to the Community!

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

DAL 2 - Using the new Repository to Persist Objects - CBO on steroids

In my previous blog on the new DotNetNuke Data Access Layer, I introduced why we were building a new Data Access Layer and the basics about what the layer includes.  In this blog I will dive a little deeper into how module developers can take advantage of the new DAL 2 by using the built in IRepository of T implementation to simplify their module development.

So that you don’t have to refer back to the previous post, Listing 1 shows the same TaskInfo (model) class that I showed in the previous post, except I have renamed it to Task, and I have removed the ModuleId property, which means that any instance of the module will return the same set of Tasks.  In a future blog I will discuss features of the DAL 2 API that allow you to scope your data.

Listing 1: The Task Model


As mentioned in the previous post the only sql that we need to include in our tasks module is the sql to create the Tasks Table.  Entity Framework Code First, and other OR/Ms can auto-generate the schema based on the objects, and this is a feature that is being considered for a future enhancement of the DAL2.  The sql to create the Tasks table in a database that is using the “dnn_” object qualifier or table prefix is shown in Listing 2.

Listing 2: The Create Table SQL to create the Tasks Table


Before we go any further and start to create our Business Layer methods, lets take a closer look at the Task class and associated Tasks table.  The first thing that jumps out is “How does the DAL 2 know to map the TaskId property to the ID column in the database. 

In fact it doesn’t know what to do and we have to tell it how to do the mapping.  The DAL 2 is built on PetaPoco and PetaPoco provides some convention based rules as well as an IMapper interface to handle mappings that don’t follow the rules.  There are two basic convention based rules:

  1. PetaPoco assumes that the table name will be the plural of the object being mapped.  
  2. PetaPoco assumes that the column names are the same as the property of the object. 

I will discuss custom mappings and the IMapper interface in a future blog, so for now we will change the name of the primary key to TaskID so the Class and Table follow the PetaPoco conventions - see Listing 3.

Listing 3 : Modified Create Table SQL


So now we are ready to create our Business Layer methods, assured that the DAL2 will know how to map our Task objects to Tasks records.

Listing 4 shows the CRUD methods to Create, Retrieve, Update and Delete a Task.

Listing 4: The TaskController Business Layer methods


All of the methods are similar - we call the DataContext.Instance method to get the default instance of the IDataContext interface.  We don’t intend to provide any other implementations of IDataContext, but this pattern supports the ability to mock the IDataContext interface in Unit Tests.  The PetaPocoDataContext instance returned implements IDisposable so we can use the C# using statement.  Inside the using code block we get an instance of IRepository of T where T is our Task in this case.

Its pretty amazing, but that is all the code you need to write to create the business and data layers for a simple module.

But there is more; custom mappings, data scoping, caching and transaction support is also included and in future blogs I will describe how they can be used in your modules.

Have fun experimenting with the CTP and please give us feedback on this new exciting feature.

This blog post is cross-posted from my personal blog.


Christopher Wolf
Hello, could you please fix the broken images? It's hard to understand the text without any images that are containing examples.
Christopher Wolf Tuesday, February 27, 2018 9:32 AM (link)

Comment Form

Only registered users may post comments.


Aderson Oliveira (22)
Alec Whittington (11)
Alessandra Daniels (3)
Alex Shirley (10)
Andrew Hoefling (3)
Andrew Nurse (30)
Andy Tryba (1)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (37)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Bogdan Litescu (1)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (213)
Chris Paterra (55)
Clint Patterson (108)
Cuong Dang (21)
Daniel Bartholomew (2)
Daniel Mettler (181)
Daniel Valadas (48)
Dave Buckner (2)
David Poindexter (12)
David Rodriguez (3)
Dennis Shiao (1)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (80)
Francisco Perez Andres (17)
Geoff Barlow (12)
George Alatrash (12)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (274)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Kelly Ford (4)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matt Rutledge (2)
Matthias Schlomann (16)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Miguel Gatmaytan (3)
Mike Horton (19)
Mitchel Sellers (40)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Oliver Hine (1)
Patricio F. Salinas (1)
Patrick Ryan (1)
Peter Donker (54)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Sacha Trauwaen (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott Schlesier (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Steven Fisher (1)
Tony Henrich (3)
Torsten Weggen (3)
Tycho de Waard (4)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (40)
Will Strohl (180)
William Severance (5)
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out