Geeks With Blogs

Steve Clements .Net and then some....

If for some reason you need to specify a specific connection string for a DataContext, you can of course pass the connection string when you initialise you DataContext object.  A common scenario could be a dev/test/stage/live connection string, but in my case its for either a live or archive database.


I however want the connection string to be handled by the DataContext, there are probably lots of different reasons someone would want to do this…but here are mine.

  • I want the same connection string for all instances of DataContext, but I don’t know what it is yet!
  • I prefer the clean code and ease of not using a constructor parameter.
  • The refactoring of using a constructor parameter could be a nightmare.


So my approach is to create a new partial class for the DataContext and handle empty constructor in there.

First from within the LINQ to SQL designer I changed the connection property to None.  This will remove the empty constructor code from the auto generated designer.cs file.


Right click on the .dbml file, click View Code and a file and class is created for you!


You’ll see the new class created in solutions explorer and the file will open.

We are going to be playing with constructors so you need to add the inheritance from System.Data.Linq.DataContext

  1. public partial class DataClasses1DataContext : System.Data.Linq.DataContext
  2.    {
  3.    }


Add the empty constructor and I have added a property that will get my connection string, you will have whatever logic you need to decide and get the connection string you require.  In my case I will be hitting a database, but I have omitted that code.

  1. public partial class DataClasses1DataContext : System.Data.Linq.DataContext
  2. {
  3.    // Connection String Keys - stored in web.config
  4.    static string LiveConnectionStringKey = "LiveConnectionString";
  5.    static string ArchiveConnectionStringKey = "ArchiveConnectionString";
  7.    protected static string ConnectionString
  8.    {
  9.       get
  10.       {
  11.          if (DoIWantToUseTheLiveConnection) {
  12.             return global::System.Configuration.ConfigurationManager.ConnectionStrings[LiveConnectionStringKey].ConnectionString;
  13.          }
  14.          else {
  15.             return global::System.Configuration.ConfigurationManager.ConnectionStrings[ArchiveConnectionStringKey].ConnectionString;
  16.          }
  17.       }
  18.    }
  20.    public DataClasses1DataContext() :
  21.       base(ConnectionString, mappingSource)
  22.    {
  23.       OnCreated();
  24.    }
  25. }


Now when I new up my DataContext, I can just leave the constructor empty and my partial class will decide which one i need to use.

Nice, clean code that can be easily refractored and tested.


Share this post :
Posted on Friday, April 16, 2010 1:14 AM .NET 3.5 , .NET , Visual Studio , LINQ | Back to top

Comments on this post: Dynamic connection for LINQ to SQL DataContext

# re: Dynamic connection for LINQ to SQL DataContext
Requesting Gravatar...
This helps centralize the config of your connection, but if you keep going down that path, you'll have bits of config spackled around the code. And Ultimately, you still have to write DoIWantToUseTheLiveConnection, which may or may not support future scenarios, like a third connection string.

In essence, what I'm saying is that your going halfway to dependency injection. Why not just go all the way and centralize all of that type of constructor config logic in one place?
Left by Tim Hoolihan on Apr 21, 2010 3:36 AM

# re: Dynamic connection for LINQ to SQL DataContext
Requesting Gravatar...
That's a fair point and I don't have an answer. I guess this served the purpose i needed it for.
Left by Steve Clements on May 20, 2010 10:21 AM

# re: Dynamic connection for LINQ to SQL DataContext
Requesting Gravatar...
This worked great, thanks for the post. So used to EF just picking up the connection string.
Left by JasonCoder on Apr 04, 2012 8:24 PM

Your comment:
 (will show your gravatar)

Copyright © Steve Clements | Powered by: