Skip to content

WrongClassException in Linq query #2599

Closed
@mm-development

Description

@mm-development

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions