The title of this post may sound a bit strange for those who have not faced this problem but it may sound a Sweet Tune Music 🙂 to those who want to resolve this nasty error in their application.
If you fall into the latter category, you can directly jump to the Solution section though everybody is definitely welcomed to read the entire post.
What is this about?
An error which occurs when using Enterprise Library Data Access Block in instantiating a Database using factory approach.
You may have followed the msdn article to setup DataAccessBlock with the correct code and the configuration in your application but always resulting into the error when you try to instantiate a database object.
Typically, software solutions are multi-layered. One of them being a Data Access Layer, aka DAL, which interacts with the Data Store(s) and performs the CRUD operations on the data in the data store. In this layer, you can either opt for ADO.Net or Enterprise Library Data Access Block to connect to Data Store (database) besides other options.
Since, the post is talking about a specific error resulted in the EntLib, lets assume that we preferred to implement DAL using EntLib Data Access Block.
Problem / Error
Activation error occured while trying to get instance of type Database, key “”
This error occurs on the below code statement, the very first statement to perform the CRUD operation into the DataStore.
Database dataStore = DatabaseFactory.CreateDatabase();
Database dataStore = DatabaseFactory.CreateDatabase("someKey");
Enterprise library consists of number of classes in different namespaces and assemblies.
Two of them are:
The above code statement is present in the former assembly. After a series of function calls in the same assembly and the latter assembly, a function in the latter assembly tries to load the former assembly using the partial name.
Note: Loading of an assembly using Partial name
This is what leads to the error if the Enterprise libraries assemblies are GACed and not copied locally into the application directory.
Assembly with a partial name won’t be found in the GAC and then the search/probing of an assembly will continue to Local Application Directory or sub-directories with the same name or as per configuration.
Since assembly is not present anywhere else except GAC, assembly loading will fail and leading to this error.
You can see this in action by launching Fusion Log Viewer utility, which comes by default. Command is : “fuslogvw” in case yof could not locate the utility. Type the command in the Visual Studio Command Prompt.
You may need to customize the Log Viewer to log all binding to disks to view every log.
[You can opt to open this assembly into a Reflector or ILSpy and go through each code statement and function call post the above code statement to understand more.]
So, is there a solution or a workaround for the above problem?
This problem is solvable. 🙂
Problem can be solved in many ways, you choose what suits you the best.
- You can deploy the enterprise library, “Microsoft.Practices.EnterpriseLibrary.Data” locally to the applcation bin directory. [This may lead to maintaining multiple copies of the same assembly]
- Another option is to have the below configuration in the application configuration file. This appears a bit clean approach but again the same configuration change has to be done at multiple places if they are using this library
<qualifyAssembly partialName="Microsoft.Practices.EnterpriseLibrary.Data" fullName="Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
Thanks to Mr. Philippe for this 2nd solution posted @ CodePlex.
9 thoughts on “Activation error occured while trying to get instance of type Database, key “” | EntLib”
To work around this issue you can actually add the following to your web.config to translate a partial assembly reference into a full one. This allows you to keep the dll’s in the GAC.
LikeLiked by 1 person
I wasted a day to avoid sending all the dlls to the GAC. With win server 2008r2 and its IIS it doesnt work with the DLLs in the bin folder. With the previous version of EL the error is access denied trying on the Microsoft.Practices.EnterpriseLibrary.Data.dll.
LikeLiked by 1 person
Thank you for sharing!!
LikeLiked by 1 person
thanks a tonne…this saved my day!!!
Thanks for sharing,
However, I have an issue with this while using BizTalk, it seems the mentioned fix won’t work, I tried adding the runtime section to the BTSNTSVc.config; however, still getting the same.
WOW. Sol #2 saved my life since I was really at my wits’ end… Thanks so much!
I tried this fix and it still does not solve the problem.
Still get the silly error.: Activation error occured while trying to get instance of type Database, key
DId you fix it already?
this post saved me from wasting my 3rd day on this issue. Thank you!