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:
Die Datenzugriffsmethode startete wie folgt:
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.
tags: Enterprise Library