Je les entités mise en jachère:Collection n'est pas sélectionnée avec NHibernate-caching
Personne Société
Et puis, il y a une entité PersonCompany qui fait une relation entre personne et société
Mapping pour personne est:
public class PersonMap : SubclassMap<Person> {
public PersonMap() {
this.Table("Person");
this.KeyColumn("Id");
this.HasMany(x => x.PersonCompanys).AsSet().KeyColumn("PersonId").Fetch.Select().Inverse().Cascade.Delete();
}
}
Société:
public class CompanyMap : SubclassMap<Company> {
public CompanyMap() {
this.Table("Company");
this.KeyColumn("Id");
this.HasMany(x => x.PersonCompanys).AsSet().KeyColumn("CompanyId").Fetch.Select().Inverse().Cascade.None();
}
}
et PersonCompany:
public class PersonCompanyMap : ClassMap<PersonCompany> {
public PersonCompanyMap() {
this.Table("PersonCompany");
this.Version(x => x.ObjectVersion);
this.Id(x => x.Id).GeneratedBy.Assigned();
this.References(x => x.Company).Column("CompanyId").Fetch.Select();
this.References(x => x.Person).Column("PersonId").Fetch.Select();
}
}
SecondLevel-Caching est activé général et pour chaque entité avec les conventions. Aussi Caching pour la PersonCompanys-Collection:
public class CachableConventions : IClassConvention, IHasManyConvention, IHasManyToManyConvention {
private static readonly Type[] notCachableTypes = new[] {typeof(Word), typeof(ActivityWord), typeof(DbVersion), typeof(Deleted), typeof(ExchangeSyncState), typeof(Synchronizer), typeof(SerialletterField)};
public void Apply(IClassInstance instance) {
if (Array.IndexOf(notCachableTypes, instance.EntityType) >= 0) {
return;
}
instance.Cache.ReadWrite();
}
public void Apply(IManyToManyCollectionInstance instance) {
if (Array.IndexOf(notCachableTypes, instance.ChildType) >= 0) {
return;
}
instance.Cache.ReadWrite();
}
public void Apply(IOneToManyCollectionInstance instance) {
if (Array.IndexOf(notCachableTypes, instance.ChildType) >= 0) {
return;
}
instance.Cache.ReadWrite();
}
}
Maintenant, je crée une nouvelle personne et après l'enregistrement, une nouvelle société, puis-je ajouter un PersonCompany-Record à la PersonCompanies-Collection.
Lorsque je sélectionne la personne créée, la collection PersonCompanys est vide. Lorsque je fais de même sans SecondLevel-Caching, PersonCompanys-Collection contient l'entité créée.
Quelqu'un sait-il, ce qui peut mal tourner ici?
Modifier - Informations supplémentaires:
ces étapes sont à l'origine du problème:
- créer une nouvelle personne
Session.Save(person)
- charge la personne
person = Session.Get(person.Id)
- get personCompany de la personne avec
personCompany = person.PersonCompany.FirstOrDefault()
(ce sera vide) - Créer une nouvelle entrée avec PersonCompany-
Session.Save(new PersonCompany(Guid.NewGuid()) {Person = person}))
- charge la personne
person = Session.Get(person.Id)
- maintenant,
person.PersonCompany
retourne une liste vide.
Lorsque je ne fais pas l'étape 3, tout fonctionne très bien.
Mon sentiment est que cela n'a rien à voir avec votre mise en cache. Sans voir ce que vous faites pendant la création des objets Person, Company et PersonCompany, je ne peux pas vous aider. –
Lorsque je désactive le deuxième niveau, il fonctionne correctement. Peut-être que le problème est de savoir comment j'associe la personne à la nouvelle PersonCompany. Je fais personCompany.Person = person et l'appel Session.Insert (personCompany) – BennoDual
Tout d'abord, sauf si vous avez une très bonne raison d'utiliser Session.Insert, vous devriez utiliser Session.SaveOrUpdate (...). Si je me souviens bien, Session.Insert évite beaucoup de la mise en cache interne. –