I have been trying to create a database schema in unit tests from nhibernate mapping files. I was able to create the tables while running an in-memory SQLLite datasource, but now that I am trying to use mssql I get the following exception message:
Initialization method FormsMVC.Tests.UnitTests.DataLayer.TravelRequestTests.TestSetup threw exception.
System.InvalidOperationException: ExecuteNonQuery requires the command to have a transaction when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.
And the stack trace is
Result StackTrace: at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Spring.Data.NHibernate.LocalSessionFactoryObject.ExecuteSchemaStatement(IDbCommand cmd, String sql) in Spring.Data.NHibernate\Data\NHibernate\LocalSessionFactoryObject.cs:line 897 at Spring.Data.NHibernate.LocalSessionFactoryObject.ExecuteSchemaScript(IDbConnection con, String[] sql) in \src\Spring\Spring.Data.NHibernate\Data\NHibernate\LocalSessionFactoryObject.cs:line 869 at Spring.Data.NHibernate.LocalSessionFactoryObject.b__1(ISession session) in \src\Spring\Spring.Data.NHibernate\Data\NHibernate\LocalSessionFactoryObject.cs:line 811 at Spring.Data.NHibernate.ExecuteHibernateCallbackUsingDelegate.DoInHibernate(ISession session) in \src\Spring\Spring.Data.NHibernate\Data\NHibernate\HibernateTemplate.cs:line 1830 at Spring.Data.NHibernate.HibernateTemplate.Execute(IHibernateCallback action, Boolean exposeNativeSession) in \src\Spring\Spring.Data.NHibernate\Data\NHibernate\HibernateTemplate.cs:line 962 at Spring.Data.NHibernate.LocalSessionFactoryObject.CreateDatabaseSchema() in \src\Spring\Spring.Data.NHibernate\Data\NHibernate\LocalSessionFactoryObject.cs:line 805 at FormsMVC.Tests.UnitTests.DataLayer.BaseMappingTests.InitializeDatabase() in FormsMVC.Tests\UnitTests\DataLayer\BaseMappingTests.cs:line 54
at FormsMVC.Tests.UnitTests.DataLayer.TravelRequestTests.TestSetup() in FormsMVC.Tests\UnitTests\DataLayer\TravelRequestTests.cs:line 36
The mapping files for sqllite and the mssql are exactly the same except for the changes for the different databases:
SQL config:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://ift.tt/1ciLKrL" xmlns:db="http://ift.tt/1y3bTYQ">
<!-- This file is used to configure the in-memory SQLite database for testing the hibernate mappings.-->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings" />
</object>
<!-- Database Configuration -->
<db:provider id="DbProvider"
provider="System.Data.SQLite"
connectionString="Data Source=:memory:;Database=Forms;User ID=Forms;Password=formpass;Trusted_Connection=False" />
<!-- NHibernate Configuration -->
<object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate33">
<property name="DbProvider" ref="DbProvider" />
<property name="MappingAssemblies">
<list>
<value>FormsMVC.Datalayer</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<entry key="dialect" value="NHibernate.Dialect.SQLiteDialect" />
<entry key="connection.driver_class" value=" NHibernate.Driver.SQLite20Driver" />
<entry key="use_proxy_validator" value="false" />
<entry key="hibernate.show_sql" value="true" />
</dictionary>
</property>
<!-- provides integation with Spring's declarative transaction management features -->
<property name="ExposeTransactionAwareSessionFactory" value="true" />
</object>
<!-- Transaction Management Strategy - local database transactions -->
<object id="transactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate33">
<property name="DbProvider" ref="DbProvider" />
<property name="SessionFactory" ref="NHibernateSessionFactory" />
</object>
<!-- BaseMappingUnitTest Class-->
<object id="BaseMappingTests" type="FormsMVC.Tests.UnitTests.DataLayer.BaseMappingTests, FormsMVC.Tests">
<property name="SessionFactory" ref="NHibernateSessionFactory" />
<property name="LocalSessionFactory" ref="&NHibernateSessionFactory" />
</object>
<!-- Exception translation object post processor -->
<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data" />
<!-- Data Access Objects -->
<object id="GameDao" type="FormsMVC.Datalayer.Dao.GameDao, FormsMVC.Datalayer">
<property name="SessionFactory" ref="NHibernateSessionFactory" />
</object>
<object id="TravelRequestDao" type="FormsMVC.Datalayer.Dao.TravelRequestDao, FormsMVC.Datalayer">
<property name="SessionFactory" ref="NHibernateSessionFactory" />
</object>
</objects>
and the mssql config is:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://ift.tt/1ciLKrL" xmlns:db="http://ift.tt/1y3bTYQ">
<!-- This file is used to configure the in-memory SQLite database for testing the hibernate mappings.-->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings" />
</object>
<!-- Database Configuration -->
<db:provider id="DbProvider"
provider="System.Data.SqlClient"
connectionString="Data Source=apsdsqldev;Database=FormsMVC_V2;User ID=FormsMVC_V2;Password=formpass;Trusted_Connection=False" />
<!-- NHibernate Configuration -->
<object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate33">
<property name="DbProvider" ref="DbProvider" />
<property name="MappingAssemblies">
<list>
<value>FormsMVC.Datalayer</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<entry key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<entry key="dialect" value="NHibernate.Dialect.MsSql2008Dialect" />
<entry key="show_sql" value="true" />
<entry key="hibernate.use_proxy_validator" value="false" />
</dictionary>
</property>
<!-- provides integation with Spring's declarative transaction management features -->
<property name="ExposeTransactionAwareSessionFactory" value="true" />
</object>
<!-- Transaction Management Strategy - local database transactions -->
<object id="transactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate33">
<property name="DbProvider" ref="DbProvider" />
<property name="SessionFactory" ref="NHibernateSessionFactory" />
</object>
<!-- BaseMappingUnitTest Class-->
<object id="BaseMappingTests" type="FormsMVC.Tests.UnitTests.DataLayer.BaseMappingTests, FormsMVC.Tests">
<property name="SessionFactory" ref="NHibernateSessionFactory" />
<property name="LocalSessionFactory" ref="&NHibernateSessionFactory" />
</object>
<!-- Exception translation object post processor -->
<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data" />
<object id="TravelRequestDao" type="FormsMVC.Datalayer.Dao.TravelRequestDao, FormsMVC.Datalayer">
<property name="SessionFactory" ref="NHibernateSessionFactory" />
</object>
</objects>
Does anyone have any suggestions? Why would this work with sqllite and not mssql?
Thank you!
Aucun commentaire:
Enregistrer un commentaire