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.
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5