У меня есть следующие сущности:
Лицо Компания
И затем есть сущность PersonCompany, которая устанавливает связь между человеком и компанией.
Отображение для человека:
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();
}
}
Компания:
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();
}
}
и 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();
}
}
Кэширование второго уровня активируется в общем и для каждого объекта с соглашениями. Также кеширование для 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();
}
}
Теперь я создаю нового человека и сохраняю новую компанию, а затем добавляю запись PersonCompany-Record в коллекцию PersonCompanies.
Когда я выберу созданного человека, PersonCompanys-Collection будет пустым. Когда я делаю то же самое без SecondLevel-Caching, PersonCompanys-Collection содержит созданную сущность.
Кто-нибудь знает, что здесь может пойти не так?
Изменить — Дополнительная информация:
Эти шаги вызывают проблему:
- создать нового человека с
Session.Save(person)
- загрузить человека с
person = Session.Get(person.Id)
- получить personCompany от человека с
personCompany = person.PersonCompany.FirstOrDefault()
(это будет пусто) - Создайте новую запись PersonCompany-Entry с
Session.Save(new PersonCompany(Guid.NewGuid()) {Person = person}))
- загрузить человека с
person = Session.Get(person.Id)
- теперь
person.PersonCompany
возвращает пустой список.
Когда я не делаю шаг 3, все работает отлично.