J'ai écrit un integrationtest qui échoue:nhibernate devrais-je vider la session explicitement après "SaveOrUpdate"?
[Test]
public void Find_WorkItemWithMatchingDescriptionExistsInRepository_ReturnsWorkItem()
{
// arrange
WorkItemRepository repository = new WorkItemRepository(IsolatingFactory);
const string Description = "A";
WorkItem itemWithMatchingDescription = WorkItem.Create(1, Description);
repository.Commit(itemWithMatchingDescription);
// act
List<WorkItem> searchResult = repository.Find(Description);
// assert
CollectionAssert.Contains(searchResult, itemWithMatchingDescription);
}
Lorsque vous regardez la sortie sql de NHibernate je remarque qu'il crée une instruction_select pour l'opération repository.Find(), mais aucune opération d'insertion avant la sélection. Si je mets un explicite session.Flush() après le référentiel.Commit cela fonctionne comme prévu, mais je trouve ce comportement étrange. Pourquoi nhibernate vider la session automatiquement lorsqu'il y a des insertions en attente et qu'une requête est effectuée sur la session?
Je trouve cela dans la documentation:
9.6. Flush
De temps en temps, ISession exécute les instructions SQL nécessaires pour synchroniser l'état de la connexion ADO.NET avec l'état des objets stockés en mémoire. Ce processus, flush, arrive par défaut aux points suivants
* from some invocations of Find() or Enumerable() * from NHibernate.ITransaction.Commit() * from ISession.Flush()
Il semble que le comportement de NHibernate par défaut est de rincer avant quering par trouver. Mon référentiel utilise Ling pour nhibernate pour la spécification de la requête, c'est peut-être un bug.
Mise à jour
Si je change la cartographie de:
public WorkItemClassMap()
{
Not.LazyLoad();
Id(wi => wi.Id).GeneratedBy.Assigned();
Map(wi => wi.Description).Length(500);
Version(wi => wi.LastChanged).UnsavedValue(new DateTime().ToString());
}
Pour:
public WorkItemClassMap()
{
Not.LazyLoad();
Id(wi => wi.Id).GeneratedBy.Identity();
Map(wi => wi.Description).Length(500);
}
Il fonctionne comme prévu (débusque NHibernate l'insert à la base de données avant d'effectuer la requête). Je ne vois pas de bonnes raisons pour ce comportement, donc je suppose que c'est un bug. Cela ressemble à un besoin de faire un vidage manuel avant d'interroger dans mes dépôts, ce qui n'est pas quelque chose que je veux vraiment faire.
ressemble à votre référentiel.Commit ne valide pas réellement ITransaction. est-ce? – dotjoe
Non, mon dépôt (est sans savoir) pas responsable de la transaction parce qu'il n'a pas commencé la transaction (mais croyez-moi, il y a une transaction :-)) – Marius