I have a problem getting my change(s) to data object retrieved using NHibernate to persist back into the database. I get no exceptions so it’s difficult to know where to look. Any suggestions?
string name = "somenewname";
string repositoryId = "somerepositoryid";
ISession nhbSession = GetNhbSession(session);
nhbSession.Transaction.Begin();
try
{
RepositoryDto existingRepository = nhbSession.Get<RepositoryDto>(repositoryId);
if (existingRepository == null || existingRepository.TimeDeleted != null)
throw new Exception("Repository does not exist in system or is deleted. Cannot modify.");
existingRepository.Name = name; //works fine up to here as expected; is in DB with old name
nhbSession.Update(existingRepository);
nhbSession.Transaction.Commit();
}
catch (Exception ex)
{
nhbSession.Transaction.Rollback();
throw new Exception("Error modifying repository: " + ex.Message, ex);
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="SomeComponent"
namespace="SomeComponent.Repository.DTO" auto-import="true" default-lazy="false">
<class name="RepositoryDto" table="Repository" mutable="false">
<id name="RepositoryId" column="repositoryId" unsaved-value="0">
<generator class="assigned"/>
</id>
<property name="SystemId" column="systemId" not-null="true" />
<property name="TimeCreated" column="timeCreated" not-null="true" />
<property name="TimeDeleted" column="timeDeleted" not-null="false" />
<property name="Name" column="name" not-null="true" />
</class>
</hibernate-mapping>
I have found the problem. There was a stray ‘mutable=”false”‘ in my RepositoryDto class mapping leftover from copy and paste of a different class mapping I presume. A really nasty one to find!!
changes to
An exception from NHibernate of the form “RepositoryDto mapping says it is not mutable so you cannot call Update on this object” would be nice!