public void EntityProjectionLockMode()
        {
            if (Dialect is Oracle8iDialect)
            {
                Assert.Ignore("Oracle is not supported due to #1352 bug (NH-3902)");
            }

            var upgradeHint = Dialect.ForUpdateString;

            if (string.IsNullOrEmpty(upgradeHint))
            {
                upgradeHint = this.Dialect.AppendLockHint(LockMode.Upgrade, string.Empty);
            }
            if (string.IsNullOrEmpty(upgradeHint))
            {
                Assert.Ignore($"Upgrade hint is not supported by dialect {Dialect.GetType().Name}");
            }

            using (var sqlLog = new SqlLogSpy())
                using (var session = OpenSession())
                {
                    EntitySimpleChild child1 = null;
                    child1 = session
                             .QueryOver <EntityComplex>()
                             .JoinAlias(ep => ep.Child1, () => child1)
                             .Lock(() => child1).Upgrade
                             .Select(Projections.Entity(() => child1))
                             .Take(1).SingleOrDefault <EntitySimpleChild>();

                    Assert.That(child1, Is.Not.Null);
                    Assert.That(NHibernateUtil.IsInitialized(child1), Is.True, "Object must be initialized");
                    Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
                    Assert.That(sqlLog.Appender.GetEvents()[0].RenderedMessage, Does.Contain(upgradeHint));
                }
        }
        public void EntityProjectionForEntityJoin()
        {
            using (var sqlLog = new SqlLogSpy())
                using (var session = OpenSession())
                {
                    EntitySimpleChild ejChild1 = null;

                    EntityComplex root = null;
                    EntityComplex st   = null;
                    var           r    = session
                                         .QueryOver(() => root)
                                         .JoinAlias(c => c.SameTypeChild, () => st)
                                         .JoinEntityAlias(() => ejChild1, () => ejChild1.Id == root.Child1.Id)
                                         .Select(
                        Projections.RootEntity(),
                        Projections.Entity(() => st),
                        Projections.Entity(() => ejChild1)
                        )
                                         .SingleOrDefault <object[]>();
                    var rootObj       = (EntityComplex)r[0];
                    var mappedObj     = (EntityComplex)r[1];
                    var entityJoinObj = (EntitySimpleChild)r[2];

                    Assert.That(rootObj, Is.Not.Null);
                    Assert.That(mappedObj, Is.Not.Null);
                    Assert.That(entityJoinObj, Is.Not.Null);
                    Assert.That(NHibernateUtil.IsInitialized(rootObj), Is.True);
                    Assert.That(NHibernateUtil.IsInitialized(mappedObj), Is.True);
                    Assert.That(NHibernateUtil.IsInitialized(entityJoinObj), Is.True);
                }
        }
        protected override void OnSetUp()
        {
            using (var session = OpenSession())
                using (var transaction = session.BeginTransaction())
                {
                    var child1 = new EntitySimpleChild
                    {
                        Name = "Child1"
                    };
                    var child2 = new EntitySimpleChild
                    {
                        Name = "Child1"
                    };

                    var parent = new EntityComplex
                    {
                        Name          = "ComplexEnityParent",
                        Child1        = child1,
                        Child2        = child2,
                        LazyProp      = "SomeBigValue",
                        SameTypeChild = new EntityComplex()
                        {
                            Name = "ComplexEntityChild"
                        }
                    };

                    _entityWithCustomEntityName = new EntityCustomEntityName()
                    {
                        Name = "EntityCustomEntityName"
                    };

                    _entityWithCompositeId = new EntityWithCompositeId
                    {
                        Key = new CompositeKey
                        {
                            Id1 = 1,
                            Id2 = 2
                        },
                        Name = "Composite"
                    };

                    session.Save(child1);
                    session.Save(child2);
                    session.Save(parent.SameTypeChild);
                    session.Save(parent);
                    session.Save(_entityWithCompositeId);
                    session.Save(customEntityName, _entityWithCustomEntityName);

                    session.Flush();
                    transaction.Commit();
                }
        }
        public async Task NullEntityProjectionAsync()
        {
            using (var session = OpenSession())
            {
                EntitySimpleChild child1 = null;
                child1 = await(session
                               .QueryOver <EntityComplex>()
                               .JoinAlias(ep => ep.Child1, () => child1, JoinType.LeftOuterJoin)
                               .Where(() => child1.Id == null)
                               .Select(Projections.Entity(() => child1))
                               .Take(1).SingleOrDefaultAsync <EntitySimpleChild>());

                Assert.That(child1, Is.Null);
            }
        }
        public async Task EntityProjectionAsSelectExpressionAsync()
        {
            using (var sqlLog = new SqlLogSpy())
                using (var session = OpenSession())
                {
                    EntitySimpleChild child1 = null;
                    child1 = await(session
                                   .QueryOver <EntityComplex>()
                                   .JoinAlias(ep => ep.Child1, () => child1)
                                   .Select(ec => child1.AsEntity())
                                   .Take(1).SingleOrDefaultAsync <EntitySimpleChild>());

                    Assert.That(child1, Is.Not.Null);
                    Assert.That(NHibernateUtil.IsInitialized(child1), Is.True, "Object must be initialized");
                    Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
                }
        }
        public void NullEntityProjection()
        {
#pragma warning disable CS8073 //The result of the expression is always 'false'
            using (var session = OpenSession())
            {
                EntitySimpleChild child1 = null;
                child1 = session
                         .QueryOver <EntityComplex>()
                         .JoinAlias(ep => ep.Child1, () => child1, JoinType.LeftOuterJoin)
                         .Where(() => child1.Id == null)
                         .Select(Projections.Entity(() => child1))
                         .Take(1).SingleOrDefault <EntitySimpleChild>();

                Assert.That(child1, Is.Null);
            }
#pragma warning restore CS8073 //The result of the expression is always 'false'
        }
        public void EntityProjectionAsSelectExpressionForArgumentAlias()
        {
            using (var sqlLog = new SqlLogSpy())
                using (var session = OpenSession())
                {
                    EntitySimpleChild child1 = null;
                    var complex = session
                                  .QueryOver <EntityComplex>()
                                  .JoinAlias(ep => ep.Child1, () => child1)
                                  .Select(ec => ec.AsEntity())
                                  .Take(1).SingleOrDefault();

                    Assert.That(complex, Is.Not.Null);
                    Assert.That(NHibernateUtil.IsInitialized(complex), Is.True, "Object must be initialized");
                    Assert.That(NHibernateUtil.IsInitialized(complex.Child1), Is.False, "Object must be lazy");
                    Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
                }
        }
 public void MixOfJoinsForAssociatedAndNotAssociatedEntities()
 {
     using (var sqlLog = new SqlLogSpy())
         using (var session = OpenSession())
         {
             EntityComplex     root     = null;
             EntityComplex     ejLevel1 = null;
             EntitySimpleChild customChildForEjLevel1             = null;
             EntityComplex     entityComplexForEjLevel1           = null;
             EntitySimpleChild ejLevel2OnEntityComplexForEjLevel1 = null;
             var obj = session
                       .QueryOver(() => root)
                       .JoinEntityAlias(() => ejLevel1, Restrictions.Where(() => ejLevel1.Id == root.SameTypeChild.Id && root.Id != null), JoinType.LeftOuterJoin)
                       .JoinAlias(() => ejLevel1.Child1, () => customChildForEjLevel1, JoinType.InnerJoin)
                       .JoinAlias(() => ejLevel1.SameTypeChild, () => entityComplexForEjLevel1, JoinType.LeftOuterJoin)
                       .JoinEntityAlias(() => ejLevel2OnEntityComplexForEjLevel1, () => entityComplexForEjLevel1.Id == ejLevel2OnEntityComplexForEjLevel1.Id)
                       .Where(() => customChildForEjLevel1.Id != null && ejLevel2OnEntityComplexForEjLevel1.Id != null)
                       .Take(1)
                       .SingleOrDefault <object>();
         }
 }
        public async Task MultipleEntitiesProjectionsToResultTransformerAsync()
        {
            using (var sqlLog = new SqlLogSpy())
                using (var session = OpenSession())
                {
                    MultipleEntitiesResult r = null;

                    EntitySimpleChild child1          = null;
                    EntitySimpleChild child2          = null;
                    EntityComplex     sameAsRootChild = null;
                    EntitySimpleChild nullListElem    = null;

                    r = await(session
                              .QueryOver <EntityComplex>()
                              .JoinAlias(ep => ep.Child1, () => child1)
                              .JoinAlias(ep => ep.Child2, () => child2)
                              .JoinAlias(ep => ep.SameTypeChild, () => sameAsRootChild)
                              .JoinAlias(ep => ep.ChildrenList, () => nullListElem, JoinType.LeftOuterJoin)
                              .Select(
                                  Projections.RootEntity().WithAlias(nameof(r.Root)),
                                  Projections.Entity(() => child1),
                                  Projections.Property(() => child2.Name).As(nameof(r.Name)),
                                  Projections.Entity(() => child2),
                                  Projections.Property(() => child1.Id),
                                  Projections.Entity(() => sameAsRootChild),
                                  Projections.Entity(() => nullListElem)
                                  )
                              .TransformUsing(Transformers.AliasToBean <MultipleEntitiesResult>())
                              .Take(1)
                              .SingleOrDefaultAsync <MultipleEntitiesResult>());

                    Assert.That(NHibernateUtil.IsInitialized(r.Root), Is.True, "Root must be initialized");
                    Assert.That(NHibernateUtil.IsInitialized(r.Child1), Is.True, "Child1 must be initialized");
                    Assert.That(NHibernateUtil.IsInitialized(r.Child2), Is.True, "Child2 must be initialized");
                    Assert.That(NHibernateUtil.IsInitialized(r.SameAsRootChild), Is.True, "SameAsRootChild must be initialized");
                    Assert.That(r.NullListElem, Is.Null, "NullListElem must be null");
                    Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
                }
        }
        public async Task MultipleEntitiesProjectionsAsync()
        {
            using (var sqlLog = new SqlLogSpy())
                using (var session = OpenSession())
                {
                    EntityComplex     root            = null;
                    EntitySimpleChild child1          = null;
                    EntitySimpleChild child2          = null;
                    EntityComplex     sameAsRootChild = null;
                    EntitySimpleChild nullListElem    = null;
                    var objects = await(session
                                        .QueryOver <EntityComplex>()
                                        .JoinAlias(ep => ep.Child1, () => child1)
                                        .JoinAlias(ep => ep.Child2, () => child2)
                                        .JoinAlias(ep => ep.SameTypeChild, () => sameAsRootChild)
                                        .JoinAlias(ep => ep.ChildrenList, () => nullListElem, JoinType.LeftOuterJoin)
                                        .Select(
                                            Projections.RootEntity(),
                                            Projections.Entity(() => child1),
                                            Projections.Entity(() => child2),
                                            Projections.Entity(() => sameAsRootChild),
                                            Projections.Entity(() => nullListElem)
                                            )
                                        .Take(1).SingleOrDefaultAsync <object[]>());

                    root            = (EntityComplex)objects[0];
                    child1          = (EntitySimpleChild)objects[1];
                    child2          = (EntitySimpleChild)objects[2];
                    sameAsRootChild = (EntityComplex)objects[3];
                    nullListElem    = (EntitySimpleChild)objects[4];

                    Assert.That(NHibernateUtil.IsInitialized(root), Is.True, "root must be initialized");
                    Assert.That(NHibernateUtil.IsInitialized(child1), Is.True, "child1 must be initialized");
                    Assert.That(NHibernateUtil.IsInitialized(child2), Is.True, "child2 must be initialized");
                    Assert.That(NHibernateUtil.IsInitialized(sameAsRootChild), Is.True, "sameAsRootChild must be initialized");
                    Assert.That(nullListElem, Is.Null, "nullListElem must be null");
                    Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
                }
        }
示例#11
0
        public async Task MixOfJoinsForAssociatedAndNotAssociatedEntitiesAsync()
        {
#pragma warning disable CS8073 //The result of the expression is always 'false'
            using (var sqlLog = new SqlLogSpy())
                using (var session = OpenSession())
                {
                    EntityComplex     root     = null;
                    EntityComplex     ejLevel1 = null;
                    EntitySimpleChild customChildForEjLevel1             = null;
                    EntityComplex     entityComplexForEjLevel1           = null;
                    EntitySimpleChild ejLevel2OnEntityComplexForEjLevel1 = null;
                    var obj = await(session
                                    .QueryOver(() => root)
                                    .JoinEntityAlias(() => ejLevel1, Restrictions.Where(() => ejLevel1.Id == root.SameTypeChild.Id && root.Id != null), JoinType.LeftOuterJoin)
                                    .JoinAlias(() => ejLevel1.Child1, () => customChildForEjLevel1, JoinType.InnerJoin)
                                    .JoinAlias(() => ejLevel1.SameTypeChild, () => entityComplexForEjLevel1, JoinType.LeftOuterJoin)
                                    .JoinEntityAlias(() => ejLevel2OnEntityComplexForEjLevel1, () => entityComplexForEjLevel1.Id == ejLevel2OnEntityComplexForEjLevel1.Id)
                                    .Where(() => customChildForEjLevel1.Id != null && ejLevel2OnEntityComplexForEjLevel1.Id != null)
                                    .Take(1)
                                    .SingleOrDefaultAsync <object>());
                }
#pragma warning restore CS8073 //The result of the expression is always 'false'
        }
        public async Task MultipleLazyEntityProjectionsAsync()
        {
            using (var session = OpenSession())
            {
                EntitySimpleChild child1        = null;
                EntityComplex     root          = null;
                EntityComplex     sameTypeChild = null;
                EntitySimpleChild child2        = null;

                var result = await(session
                                   .QueryOver(() => root)
                                   .JoinAlias(ep => ep.SameTypeChild, () => sameTypeChild)
                                   .JoinAlias(ep => ep.Child1, () => child1)
                                   .JoinAlias(ep => ep.Child2, () => child2)
                                   .Select(
                                       Projections.RootEntity().SetLazy(true),
                                       Projections.Entity(() => child1).SetLazy(true),
                                       Projections.Entity(() => sameTypeChild).SetLazy(true),
                                       Projections.Entity(() => child2).SetLazy(true)
                                       )
                                   .Take(1).SingleOrDefaultAsync <object[]>());

                root          = (EntityComplex)result[0];
                child1        = (EntitySimpleChild)result[1];
                sameTypeChild = (EntityComplex)result[2];
                child2        = (EntitySimpleChild)result[3];

                Assert.That(NHibernateUtil.IsInitialized(root), Is.False, "root must be lazy loaded.");
                Assert.That(NHibernateUtil.IsInitialized(sameTypeChild), Is.False, "sameTypeChild must be lazy loaded.");
                Assert.That(NHibernateUtil.IsInitialized(child1), Is.False, "child1 must be lazy loaded.");
                Assert.That(NHibernateUtil.IsInitialized(child2), Is.False, "child2 must be lazy loaded.");

                //make sure objects are populated from different aliases for the same types
                Assert.That(root.Id, Is.Not.EqualTo(sameTypeChild.Id), "Different objects are expected for root and sameTypeChild.");
                Assert.That(child1.Id, Is.Not.EqualTo(child2.Id), "Different objects are expected for child1 and child2.");
            }
        }