Closed
Description
I have update NH to version 5.3.4 and now a few queries in my application throw WrongClassException. Here is a sample code to reproduce this issue (I run tests on Sqlite db but probably this is not imporant):
[Test]
public void Test()
{
using (var session = _sessionFactory.OpenSession())
{
var entity = new Entity();
entity.Date = DateTime.UtcNow;
session.Save(entity);
var person = new PersonType();
person.Name = "pers1";
person.Entity = entity;
session.Save(person);
var comp = new CompanyType();
comp.Name = "comp";
comp.Entity = entity;
session.Save(comp);
session.Flush();
}
using (var session = _sessionFactory.OpenSession())
{
var test=session.QueryOver<PersonType>().SingleOrDefault();
var jobQuery = from en in Session.Query<Entity>()
join per in Session.Query<PersonType>() on en equals per.Entity
select Tuple.Create(en, per);
var companyQuery = from en in Session.Query<Entity>()
join per in Session.Query<CompanyType>() on en equals per.Entity
select Tuple.Create(en, per);
var res = jobQuery.ToList();
var res1 = companyQuery.ToList();
}
}
}
public class EntityMapping : ClassMapping<Entity>
{
public EntityMapping()
{
Id(x => x.Id, map => map.Generator(Generators.GuidComb));
Property(x => x.Date, h =>
{
h.NotNullable(false);
h.Type<UtcDateTimeType>();
});
}
}
public class BaseTypeMapping : ClassMapping<BaseType>
{
public BaseTypeMapping()
{
Id(x => x.Id, map => map.Generator(Generators.GuidComb));
Property(x => x.Name, h =>
{
h.NotNullable(false);
});
ManyToOne(x=>x.Entity);
}
}
public class PersonTypeMapping : SubclassMapping<PersonType>
{
public PersonTypeMapping()
{
DiscriminatorValue("Person");
}
}
public class CompanyTypeMapping : SubclassMapping<CompanyType>
{
public CompanyTypeMapping()
{
DiscriminatorValue("Company");
}
}
public class Entity
{
public virtual Guid Id { get; set; }
public virtual DateTime Date { get; set; }
}
public class BaseType
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual Entity Entity { get; set; }
}
public class PersonType : BaseType
{
}
public class CompanyType : BaseType
{
}
If you run this test, you should get:
NHibernate.WrongClassException: Object with id: 25fc2501-6553-488c-91ec-ac6e0077b9a5 was not of the specified subclass: ManualMaster.Tests.Services.CompanyType (loading object was of wrong class [ManualMaster.Tests.Services.PersonType])
at NHibernate.Loader.Loader.InstanceAlreadyLoaded(DbDataReader rs, Int32 i, ILoadable persister, EntityKey key, Object obj, LockMode lockMode, ISessionImplementor session, Action`2 cacheBatchingHandler) in C:\Sources\nhibernate-core-5.3.4\src\NHibernate\Loader\Loader.cs:line 1076
at NHibernate.Loader.Loader.GetRow(DbDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session, Boolean mustLoadMissingEntity, Action`2 cacheBatchingHandler) in C:\Sources\nhibernate-core-5.3.4\src\NHibernate\Loader\Loader.cs:line 1037
at NHibernate.Loader.Loader.GetRowFromResultSet(DbDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder, Action`2 cacheBatchingHandler) in C:\Sources\nhibernate-core-5.3.4\src\NHibernate\Loader\Loader.cs:line 401
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder) in C:\Sources\nhibernate-core-5.3.4\src\NHibernate\Loader\Loader.cs:line 537