private void ReferenceInitBeforeSetStructureField(Session session)
        {
            var referencedEntity  = new EntityReferencedFromStructure();
            var twoLevelStructure = new SecondLevelStructure {
                X = 10, Y = 10, EntityField = referencedEntity
            };

            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(0));
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(0));
            Assert.That(ReferenceFinder.GetReferencesTo(referencedEntity).Count(), Is.EqualTo(0));

            var oneLevelStructure = new FirstLevelStructure {
                SecondLevelStructure = twoLevelStructure, EntityField = referencedEntity
            };

            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(0));
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(0));
            Assert.That(ReferenceFinder.GetReferencesTo(referencedEntity).Count(), Is.EqualTo(0));

            var zeroLevelStructure = new ZeroLevelStructure {
                FirstLevelStructure = oneLevelStructure, EntityField = referencedEntity
            };

            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(0));
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(0));
            Assert.That(ReferenceFinder.GetReferencesTo(referencedEntity).Count(), Is.EqualTo(0));

            var entity = new EntityWithStructure();

            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(0));
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(0));
            Assert.That(ReferenceFinder.GetReferencesTo(referencedEntity).Count(), Is.EqualTo(0));

            entity.Structure = zeroLevelStructure;
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(3));
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(0));
            var references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();

            Assert.That(references.Count, Is.EqualTo(3));
            var expectedAssociation = entity.TypeInfo.Fields["Structure.FirstLevelStructure.SecondLevelStructure.EntityField"].Associations.First();

            Assert.That(expectedAssociation.IsPaired, Is.False);
            Assert.That(expectedAssociation.TargetType, Is.EqualTo(referencedEntity.TypeInfo));
            Assert.That(expectedAssociation.OwnerType, Is.EqualTo(entity.TypeInfo));
            Assert.That(references.Any(r => r.Association == expectedAssociation && r.ReferencingEntity == entity && r.ReferencedEntity == referencedEntity), Is.True);

            expectedAssociation = entity.TypeInfo.Fields["Structure.FirstLevelStructure.EntityField"].Associations.First();
            Assert.That(expectedAssociation.IsPaired, Is.False);
            Assert.That(expectedAssociation.TargetType, Is.EqualTo(referencedEntity.TypeInfo));
            Assert.That(expectedAssociation.OwnerType, Is.EqualTo(entity.TypeInfo));
            Assert.That(references.Any(r => r.Association == expectedAssociation && r.ReferencingEntity == entity && r.ReferencedEntity == referencedEntity), Is.True);

            expectedAssociation = entity.TypeInfo.Fields["Structure.EntityField"].Associations.First();
            Assert.That(expectedAssociation.IsPaired, Is.False);
            Assert.That(expectedAssociation.TargetType, Is.EqualTo(referencedEntity.TypeInfo));
            Assert.That(expectedAssociation.OwnerType, Is.EqualTo(entity.TypeInfo));
            Assert.That(references.Any(r => r.Association == expectedAssociation && r.ReferencingEntity == entity && r.ReferencedEntity == referencedEntity), Is.True);
        }
        private void SetStructureWithNestedStructuresSaved(Session session)
        {
            var entitiesWithStructure = session.Query.All <EntityWithStructure>().ToList();

            var entity           = entitiesWithStructure[0];
            var referencedEntity = entity.Structure.EntityField;

            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(0));
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(0));
            var references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();

            Assert.That(references.Count, Is.EqualTo(3));

            entity.Structure.EntityField = null;
            entity.Structure.FirstLevelStructure.EntityField = null;
            entity.Structure.FirstLevelStructure.SecondLevelStructure.EntityField = null;
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(3));
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(0));
            references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(0));

            entity           = entitiesWithStructure[1];
            referencedEntity = entity.Structure.EntityField;
            references       = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));

            var newReferencedEntity = new EntityReferencedFromStructure();

            entity           = entitiesWithStructure[3];
            referencedEntity = entity.Structure.EntityField;
            references       = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));
            references = ReferenceFinder.GetReferencesTo(newReferencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(0));
            entity.Structure.EntityField = newReferencedEntity;
            entity.Structure.FirstLevelStructure.EntityField = newReferencedEntity;
            entity.Structure.FirstLevelStructure.SecondLevelStructure.EntityField = newReferencedEntity;
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(6));
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(3));
            references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(0));
            references = ReferenceFinder.GetReferencesTo(newReferencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));

            entity              = entitiesWithStructure[4];
            referencedEntity    = entity.Structure.EntityField;
            newReferencedEntity = new EntityReferencedFromStructure();
            references          = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));
            references = ReferenceFinder.GetReferencesTo(newReferencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(0));
            var struct1 = new ZeroLevelStructure {
                EntityField         = newReferencedEntity,
                FirstLevelStructure = new FirstLevelStructure {
                    EntityField          = newReferencedEntity,
                    SecondLevelStructure = new SecondLevelStructure {
                        EntityField = newReferencedEntity
                    }
                }
            };

            entity.Structure = struct1;
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(9));
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(6));
            references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(0));
            references = ReferenceFinder.GetReferencesTo(newReferencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));

            newReferencedEntity = new EntityReferencedFromStructure();
            var struct2 = new FirstLevelStructure {
                EntityField          = newReferencedEntity,
                SecondLevelStructure = new SecondLevelStructure {
                    EntityField = newReferencedEntity
                }
            };

            entity           = entitiesWithStructure[5];
            referencedEntity = entity.Structure.EntityField;
            references       = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));
            references = ReferenceFinder.GetReferencesTo(newReferencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(0));

            entity.Structure.FirstLevelStructure = struct2;
            var typeInfo      = entity.TypeInfo;
            var tAssociations = typeInfo.GetTargetAssociations();
            var oAssociations = typeInfo.GetOwnerAssociations();

            typeInfo      = newReferencedEntity.TypeInfo;
            tAssociations = typeInfo.GetTargetAssociations();
            oAssociations = typeInfo.GetOwnerAssociations();

            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(11));
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(8));
            references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(1));
            references = ReferenceFinder.GetReferencesTo(newReferencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(2));

            newReferencedEntity = new EntityReferencedFromStructure();
            var struct3 = new SecondLevelStructure {
                EntityField = newReferencedEntity
            };

            entity           = entitiesWithStructure[6];
            referencedEntity = entity.Structure.EntityField;
            references       = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));
            references = ReferenceFinder.GetReferencesTo(newReferencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(0));
            entity.Structure.FirstLevelStructure.SecondLevelStructure = struct3;
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(12));
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(9));
            references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(2));
            references = ReferenceFinder.GetReferencesTo(newReferencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(1));

            entity           = entitiesWithStructure[7];
            referencedEntity = entity.Structure.EntityField;
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(12));
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(9));
            references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));
            var struct4 = new ZeroLevelStructure {
                EntityField         = referencedEntity,
                FirstLevelStructure = new FirstLevelStructure {
                    EntityField          = referencedEntity,
                    SecondLevelStructure = new SecondLevelStructure {
                        EntityField = referencedEntity
                    }
                }
            };

            entity.Structure = struct4;
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(12));
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(9));
            references = ReferenceFinder.GetReferencesTo(referencedEntity).ToList();
            Assert.That(references.Count, Is.EqualTo(3));
        }