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);
        }
        protected override void PopulateData()
        {
            using (var session = Domain.OpenSession())
                using (var transaction = session.OpenTransaction()) {
                    var rub = new Currency {
                        Sign = "₽", FullName = "Ruble"
                    };
                    var dollar = new Currency {
                        Sign = "$", FullName = "Dollar"
                    };
                    var localCost = new Cost {
                        Value = 10, Currency = rub
                    };
                    var globalCost = new Cost {
                        Value = 10, Currency = dollar
                    };
                    var names = new[] { "Awesome thing", "Gorgeous thing", "Outstanding thing", "Breathtaking thing", "Super cool thing" };

                    foreach (var name in names)
                    {
                        new Product {
                            ProductName        = name,
                            LocalCurrencyCost  = localCost,
                            GlobalCurrencyCost = globalCost
                        };
                    }

                    for (int i = 0; i < EntitiesWithStructureCount; i++)
                    {
                        var referencedEntity  = new EntityReferencedFromStructure();
                        var referencingEntity = new EntityWithStructure()
                        {
                            Structure = new ZeroLevelStructure()
                            {
                                EntityField         = referencedEntity,
                                FirstLevelStructure = new FirstLevelStructure {
                                    EntityField          = referencedEntity,
                                    SecondLevelStructure = new SecondLevelStructure {
                                        EntityField = referencedEntity
                                    }
                                }
                            }
                        };
                    }
                    transaction.Complete();
                }
        }
        private void DropStructureWithNestedStructures(Session session)
        {
            var referencedEntity1 = new EntityReferencedFromStructure();
            var referencedEntity2 = new EntityReferencedFromStructure();

            var entity1 = new EntityWithStructure {
                Structure = new ZeroLevelStructure {
                    EntityField         = referencedEntity1,
                    FirstLevelStructure = new FirstLevelStructure {
                        EntityField          = referencedEntity1,
                        SecondLevelStructure = new SecondLevelStructure {
                            EntityField = referencedEntity1
                        }
                    }
                }
            };
            var entity2 = new EntityWithStructure {
                Structure = new ZeroLevelStructure {
                    EntityField         = referencedEntity2,
                    FirstLevelStructure = new FirstLevelStructure {
                        EntityField          = referencedEntity2,
                        SecondLevelStructure = new SecondLevelStructure {
                            EntityField = referencedEntity2
                        }
                    }
                }
            };

            var associations = new AssociationInfo[3];
            var typeInfo     = entity1.TypeInfo;

            associations[0] = typeInfo.Fields["Structure.EntityField"].Associations.First();
            associations[1] = typeInfo.Fields["Structure.FirstLevelStructure.EntityField"].Associations.First();
            associations[2] = typeInfo.Fields["Structure.FirstLevelStructure.SecondLevelStructure.EntityField"].Associations.First();
            Assert.That(associations.All(a => !a.IsPaired && a.TargetType == referencedEntity1.TypeInfo && a.OwnerType == entity1.TypeInfo));

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

            Assert.That(references.Count, Is.EqualTo(3));
            Assert.That(references.Any(r => r.Association == associations[0] && r.ReferencingEntity == entity1 && r.ReferencedEntity == referencedEntity1), Is.True);
            Assert.That(references.Any(r => r.Association == associations[1] && r.ReferencingEntity == entity1 && r.ReferencedEntity == referencedEntity1), Is.True);
            Assert.That(references.Any(r => r.Association == associations[2] && r.ReferencingEntity == entity1 && r.ReferencedEntity == referencedEntity1), Is.True);

            references = ReferenceFinder.GetReferencesTo(referencedEntity2).ToList();
            Assert.That(references.Count, Is.EqualTo(3));
            Assert.That(references.Any(r => r.Association == associations[0] && r.ReferencingEntity == entity2 && r.ReferencedEntity == referencedEntity2), Is.True);
            Assert.That(references.Any(r => r.Association == associations[1] && r.ReferencingEntity == entity2 && r.ReferencedEntity == referencedEntity2), Is.True);
            Assert.That(references.Any(r => r.Association == associations[2] && r.ReferencingEntity == entity2 && r.ReferencedEntity == referencedEntity2), Is.True);

            entity1.Structure.FirstLevelStructure.SecondLevelStructure.EntityField = null;
            entity1.Structure.FirstLevelStructure.EntityField = null;
            entity1.Structure.EntityField = null;
            Assert.That(session.NonPairedReferencesRegistry.AddedReferencesCount, Is.EqualTo(3));
            Assert.That(session.NonPairedReferencesRegistry.RemovedReferencesCount, Is.EqualTo(0));
            references = ReferenceFinder.GetReferencesTo(referencedEntity1).ToList();
            Assert.That(references.Count, Is.EqualTo(0));
            Assert.That(references.Any(r => r.Association == associations[0] && r.ReferencingEntity == entity1 && r.ReferencedEntity == referencedEntity1), Is.False);
            Assert.That(references.Any(r => r.Association == associations[1] && r.ReferencingEntity == entity1 && r.ReferencedEntity == referencedEntity1), Is.False);
            Assert.That(references.Any(r => r.Association == associations[2] && r.ReferencingEntity == entity1 && r.ReferencedEntity == referencedEntity1), Is.False);

            references = ReferenceFinder.GetReferencesTo(referencedEntity2).ToList();
            Assert.That(references.Count, Is.EqualTo(3));
            Assert.That(references.Any(r => r.Association == associations[0] && r.ReferencingEntity == entity2 && r.ReferencedEntity == referencedEntity2), Is.True);
            Assert.That(references.Any(r => r.Association == associations[1] && r.ReferencingEntity == entity2 && r.ReferencedEntity == referencedEntity2), Is.True);
            Assert.That(references.Any(r => r.Association == associations[2] && r.ReferencingEntity == entity2 && r.ReferencedEntity == referencedEntity2), Is.True);
        }