2010-10-07 8 views
0

J'ai un problème pour obtenir ma modification (s) à l'objet de données extrait en utilisant NHibernate pour persister dans la base de données. Je ne reçois aucune exception, il est donc difficile de savoir où regarder. Aucune suggestion?La mise à jour de Nhibernate ne persiste pas la modification de la base de données

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> 

Répondre

1

J'ai trouvé le problème. Il y avait un 'mutable' "false" 'dans mon RepositoryDto classant les restes de la copie et du collage d'une autre classe de mapping que je suppose. Un vraiment méchant à trouver !!

<class name="RepositoryDto" table="Repository" mutable="false"> 

changements à

<class name="RepositoryDto" table="Repository" mutable="true"> <!-- or just delete mutable to use default of true --> 

Une exception de NHibernate du formulaire « cartographie RepositoryDto dit que ce n'est pas mutable de sorte que vous ne pouvez pas appeler mise à jour sur cet objet » serait bien!

+0

Lol ... tellement vrai. – rebelliard

1

Vous êtes absent le Flush:

// etc... 
nhbSession.Update(existingRepository); 
nhbSession.Flush(); 
nhbSession.Transaction.Commit(); 
// etc... 

Plus: Committing the database transaction

+0

Ajout de vidage ne change pas le comportement. J'ai essayé. Il ne devrait pas être nécessaire cependant, car il sera autoflush sur commit par défaut. Merci tout de même. – Lisa

+0

@Lisa: pourriez-vous essayer d'utiliser au lieu de tx.Begin(), comme http://www.codepaste.net/nji87s? – rebelliard

+0

Merci encore, mais il semble que l'élimination de la transaction n'aide toujours pas. J'ai même essayé de disposer de la session au cas où quelque chose manquait. Je sais que les modifications sont apportées à la version 'locale ou mise en cache' de NHibernate de l'objet RepositoryDto parce que si je fais un autre appel Get dans la transaction, il a le nouveau nom. Toujours pas persisté à DB si. – Lisa

Questions connexes