Enterprise Library 2006 Data Access Application Block: NullReferenceException bei CreateDatabase();

Written on November 23, 2006

Heute hatte ich mit einem seltsamen Verhalten des Data Acces Application Blocks bei der Enterprise Library 2006 zu kämpfen:

Meine Konfiguration für einen DataLayer, die ich mit dem Enterprise Library Configuration Tool erstellt hatte, sah wie folgt aus:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, 
Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
  </configSections>
  <dataConfiguration defaultDatabase="Quickstart">
  <connectionStrings>
    <add name="Quickstart" connectionString="Database=Quickstart;Server=(local)\SQLEXPRESS;Integrated Security=SSPI;"
      providerName="System.Data.SqlClient">
  </connectionStrings>
</configuration>

Die Datenzugriffsmethode startete wie folgt:

Database db = DatabaseFactory.CreateDatabase();

Soweit - so gut, sollte eigentlich problemlos funktionieren. Allerdings erhielt ich beim Debuggen immer eine NullReferenceException beim Aufruf der CreateDatabase()-Methode:

"Object reference not set to an instance of an object."

Der Stack-Trace sah wie folgt aus:

at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseConfigurationView.get_DefaultName()
at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseMapper.MapName(String name, IConfigurationSource configSource)
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.ConfigurationNameMappingStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id)
at Microsoft.Practices.ObjectBuilder.BuilderBase`1.DoBuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies)
at Microsoft.Practices.ObjectBuilder.BuilderBase`1.BuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies)
at Microsoft.Practices.ObjectBuilder.BuilderBase`1.BuildUp[TTypeToBuild](IReadWriteLocator locator, String idToBuild, Object existing, PolicyList[] transientPolicies)
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.EnterpriseLibraryFactory.BuildUp[T](IReadWriteLocator locator, IConfigurationSource configurationSource)
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.EnterpriseLibraryFactory.BuildUp[T](IConfigurationSource configurationSource)
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.NameTypeFactoryBase`1.CreateDefault()
at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase()
at SampleApplication1.DataAccess.Sql.Location.Insert(Location Location) in C:\Projects\SampleDataLayer\DataAccess.Location.cs:line 62

Nach einigem Suchen kam ich der Ursache auf den Grund: Ich hatte ein UnitTest-Projekt zum DataLayer hinzugefügt, welches dann zum Debuggen aufgerufen wurde. Und eben dieses UnitTest-Projekt hatte keine App.config, die die Data Access Application Block Konfiguration beinhaltete.

Lösung: einfach die SampleApplication1.DataAccess.dll.config in das Debug-Verzeichnis des UnitTest-Projektes mit dem DLL-Namen des Test-Projektes speichern, also z.B. SampleApplication1.DataAccessTest.dll.config.

Problem gelöst.