diff --git a/src/NHibernate.Test/Async/Criteria/EntityProjectionsTest.cs b/src/NHibernate.Test/Async/Criteria/EntityProjectionsTest.cs index 1b3a894bc4e..13eec67564f 100644 --- a/src/NHibernate.Test/Async/Criteria/EntityProjectionsTest.cs +++ b/src/NHibernate.Test/Async/Criteria/EntityProjectionsTest.cs @@ -25,7 +25,9 @@ namespace NHibernate.Test.Criteria [TestFixture] public class EntityProjectionsTestAsync : TestCaseMappingByCode { + private const string customEntityName = "CustomEntityName"; private EntityWithCompositeId _entityWithCompositeId; + private EntityCustomEntityName _entityWithCustomEntityName; protected override HbmMapping GetMappings() { @@ -76,6 +78,16 @@ protected override HbmMapping GetMappings() rc.Property(e => e.Name); }); + + mapper.Class( + rc => + { + rc.EntityName(customEntityName); + + rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb)); + rc.Property(x => x.Name); + }); + return mapper.CompileMappingForAllExplicitlyAddedEntities(); } @@ -117,6 +129,11 @@ protected override void OnSetUp() } }; + _entityWithCustomEntityName = new EntityCustomEntityName() + { + Name = "EntityCustomEntityName" + }; + _entityWithCompositeId = new EntityWithCompositeId { Key = new CompositeKey @@ -132,6 +149,7 @@ protected override void OnSetUp() session.Save(parent.SameTypeChild); session.Save(parent); session.Save(_entityWithCompositeId); + session.Save(customEntityName, _entityWithCustomEntityName); session.Flush(); transaction.Commit(); @@ -459,5 +477,22 @@ public async Task EntityProjectionForCompositeKeyLazyAsync() Assert.That(NHibernateUtil.IsInitialized(composite), Is.False, "Object must be lazy loaded."); } } + + [Test] + public async Task EntityProjectionForCustomEntityNameAsync() + { + using (var session = OpenSession()) + { + var entity = await (session + .QueryOver(customEntityName) + .Select(Projections.RootEntity()) + .Take(1).SingleOrDefaultAsync()); + + Assert.That(entity, Is.Not.Null); + Assert.That(NHibernateUtil.IsInitialized(entity), Is.True, "Object must be initialized."); + Assert.That(entity.Id, Is.EqualTo(_entityWithCustomEntityName.Id)); + Assert.That(entity.Name, Is.EqualTo(_entityWithCustomEntityName.Name)); + } + } } } diff --git a/src/NHibernate.Test/Criteria/EntityProjectionsEntities.cs b/src/NHibernate.Test/Criteria/EntityProjectionsEntities.cs index d4d5edcd415..9cbd8d892ee 100644 --- a/src/NHibernate.Test/Criteria/EntityProjectionsEntities.cs +++ b/src/NHibernate.Test/Criteria/EntityProjectionsEntities.cs @@ -8,6 +8,12 @@ public class EntitySimpleChild public virtual Guid Id { get; set; } public virtual string Name { get; set; } } + + public class EntityCustomEntityName + { + public virtual Guid Id { get; set; } + public virtual string Name { get; set; } + } public class EntityComplex { diff --git a/src/NHibernate.Test/Criteria/EntityProjectionsTest.cs b/src/NHibernate.Test/Criteria/EntityProjectionsTest.cs index 7c75db331c2..39f72d09fec 100644 --- a/src/NHibernate.Test/Criteria/EntityProjectionsTest.cs +++ b/src/NHibernate.Test/Criteria/EntityProjectionsTest.cs @@ -14,7 +14,9 @@ namespace NHibernate.Test.Criteria [TestFixture] public class EntityProjectionsTest : TestCaseMappingByCode { + private const string customEntityName = "CustomEntityName"; private EntityWithCompositeId _entityWithCompositeId; + private EntityCustomEntityName _entityWithCustomEntityName; protected override HbmMapping GetMappings() { @@ -65,6 +67,16 @@ protected override HbmMapping GetMappings() rc.Property(e => e.Name); }); + + mapper.Class( + rc => + { + rc.EntityName(customEntityName); + + rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb)); + rc.Property(x => x.Name); + }); + return mapper.CompileMappingForAllExplicitlyAddedEntities(); } @@ -106,6 +118,11 @@ protected override void OnSetUp() } }; + _entityWithCustomEntityName = new EntityCustomEntityName() + { + Name = "EntityCustomEntityName" + }; + _entityWithCompositeId = new EntityWithCompositeId { Key = new CompositeKey @@ -121,6 +138,7 @@ protected override void OnSetUp() session.Save(parent.SameTypeChild); session.Save(parent); session.Save(_entityWithCompositeId); + session.Save(customEntityName, _entityWithCustomEntityName); session.Flush(); transaction.Commit(); @@ -448,5 +466,22 @@ public void EntityProjectionForCompositeKeyLazy() Assert.That(NHibernateUtil.IsInitialized(composite), Is.False, "Object must be lazy loaded."); } } + + [Test] + public void EntityProjectionForCustomEntityName() + { + using (var session = OpenSession()) + { + var entity = session + .QueryOver(customEntityName) + .Select(Projections.RootEntity()) + .Take(1).SingleOrDefault(); + + Assert.That(entity, Is.Not.Null); + Assert.That(NHibernateUtil.IsInitialized(entity), Is.True, "Object must be initialized."); + Assert.That(entity.Id, Is.EqualTo(_entityWithCustomEntityName.Id)); + Assert.That(entity.Name, Is.EqualTo(_entityWithCustomEntityName.Name)); + } + } } } diff --git a/src/NHibernate/Criterion/EntityProjection.cs b/src/NHibernate/Criterion/EntityProjection.cs index 6f1cb79949e..814e1a0decd 100644 --- a/src/NHibernate/Criterion/EntityProjection.cs +++ b/src/NHibernate/Criterion/EntityProjection.cs @@ -151,23 +151,27 @@ private void SetFields(ICriteriaQuery criteriaQuery) entityProjectionQuery.RegisterEntityProjection(this); } - if (_entityType == null) - { - _entityType = criteria.GetRootEntityTypeIfAvailable(); - } - if (_entityAlias == null) { _entityAlias = criteria.Alias; } - Persister = criteriaQuery.Factory.GetEntityPersister(_entityType.FullName) as IQueryable; - if (Persister == null) - throw new HibernateException($"Projecting to entities requires a '{typeof(IQueryable).FullName}' persister, '{_entityType.FullName}' does not have one."); + ICriteria subcriteria = + criteria.GetCriteriaByAlias(_entityAlias) + ?? throw new HibernateException($"Criteria\\QueryOver alias '{_entityAlias}' for entity projection is not found."); + + var entityName = + criteriaQuery.GetEntityName(subcriteria) + ?? throw new HibernateException($"Criteria\\QueryOver alias '{_entityAlias}' is not associated with an entity."); - ICriteria subcriteria = criteria.GetCriteriaByAlias(_entityAlias); - if (subcriteria == null) - throw new HibernateException($"Criteria\\QueryOver alias '{_entityAlias}' for entity projection is not found."); + Persister = + criteriaQuery.Factory.GetEntityPersister(entityName) as IQueryable + ?? throw new HibernateException($"Projecting to entities requires a '{typeof(IQueryable).FullName}' persister, '{entityName}' does not have one."); + + if (_entityType == null) + { + _entityType = Persister.Type.ReturnedClass; + } TableAlias = criteriaQuery.GetSQLAlias( subcriteria,