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.

A solution to the problem with installing LINQ to SQL modules


There are three problems with using LINQ to SQL with DotNetNuke:

Problem 1: You have to add keys to the web.config

Currently you have to alter the DotNetNuke web.config to use any code that uses LINQ to SQL. (see the end of this article: for a list of the changes required).

Problem 2 & 3: LINQ to SQL is unable to properly handle the {databaseOwner} and the {objectQualifier} features.

Normally the DotNetNuke module installation scripts are written like this:

CREATE TABLE {databaseOwner}[{objectQualifier}ThingsForSale] 

The script commands "{databaseOwner}" and "{objectQualifier}" indicate that they are to be replaced by configuration settings in the web.config file. Normally "{databaseOwner}" is set to ".dbo" and  "{objectQualifier}" is set to nothing (it would not have a setting). However, if alternate settings were indicated in the web.config file, those settings would be inserted into the script at the appropriate point. If the object qualifier were “web1” then the table created would be named:


If this happens LINQ to SQL will not be able to find the table because it woud be looking for:


The solution that did not work: Instructing LINQ to SQL to look for the proper name at run-time.

LINQ to SQL is very extensible. It stores the database schema in a DataContext class file (a file with the extension .designer that inherits from “System.Data.Linq.DataContext”) . This file contains methods that you can implement in a partial class to add functionality. One method is:

partial void OnCreated();

I created a method like this:


     public partial class MessagesDataContext
        partial void OnCreated()
            Table objThingsForSale = (Table )this.GetTable ();

And I was able to set a break point and see that it was indeed called when the DataContext was created (this DataContext is then used to retrieve data from the database and update it using LINQ). The problem is you can not tell it that “dbo.ThingsForSale” Is now “dbo.web1_ThingsForSale”. You have to make the change before LINQ to SQL gets to this point.

However, changing the table attribute in the .designer file from “dbo.ThingsForSale” to “dbo.web1_ThingsForSale” will allow LINQ to SQL to find the table properly.

The solution:

A module needs to be created, let’s call it the “installer”, that when installed will create the needed keys in the web.config (or not if they already exist). The module needs to first ensure that ASP.NET 3.5 is installed first (see: Module Installer - Permissions and Dependencies ( for how this can be done).

Next this “installer” module can be used to install any LINQ to SQL DotNetNuke modules. This module will read the {databaseOwner} and the {objectQualifier} in the web.config and rename the table names in the .designer file.

Why I won’t be working on this:

The reason why I am writing a blog about this and not creating the module is that I don’t need it. We don’t use the {databaseOwner} and the {objectQualifier} at my job and we simply added the keys needed to the web.config. We are happily using LINQ to SQL in our DotNetNuke modules and we couldn’t be happier.

It’s the module developers who are selling modules who could use a method such as this. They could tell their customers to upload the first “installer” module and then use it to upload the main module. The first module, the “installer” should be Open Source and made available to everyone.

When and if a Core solution/change is made available nothing should “break”. 

Just an idea.


Comment Form

Only registered users may post comments.


Aderson Oliveira (22)
Alec Whittington (11)
Alessandra Davies (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)
Timo Breumelhof (24)
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