public void CircularReferenceBreaker_Test()
        {
            XmlConfigurator.Configure();

            var breaker = new CircularReferenceBreaker();

            Assert.IsFalse(breaker.IsVisited<object, object, object>(this.TestMethod));

            breaker.Push<object, object, object>(this.TestMethod);

            Assert.IsTrue(breaker.IsVisited<object, object, object>(this.TestMethod));

            breaker.Push<object, object, object>(this.TestMethod);

            Assert.IsTrue(breaker.IsVisited<object, object, object>(this.TestMethod));

            breaker.Pop();

            Assert.IsTrue(breaker.IsVisited<object, object, object>(this.TestMethod));

            breaker.Pop();

            Assert.IsFalse(breaker.IsVisited<object, object, object>(this.TestMethod));
        }
        public override void Write(CircularReferenceBreaker breaker, IWritePrimitives writer, Counter order, AbstractRepositoryOperation[] orderedOperations)
        {
            InsertRecord.Logger.Debug("Entering Write:" + this);
            InsertRecord.Logger.Debug($"breaker: {breaker}");

            if (breaker.IsVisited<IWritePrimitives, Counter, AbstractRepositoryOperation[]>(this.Write))
            {
                InsertRecord.Logger.Debug("Write already visited. Exiting");
                return;
            }

            if (this.IsWriteDone)
            {
                InsertRecord.Logger.Debug("Write already done. Exiting");
                return;
            }

            breaker.Push<IWritePrimitives, Counter, AbstractRepositoryOperation[]>(this.Write);

            this.primaryKeyOperations = this.service.GetPrimaryKeyOperations(this.Peers).ToList();

            this.service.WritePrimaryKeyOperations(writer, this.primaryKeyOperations, breaker, order, orderedOperations);

            Columns columnData = this.GetColumnData(writer);

            this.Order = order.Value++;
            InsertRecord.Logger.Debug($"this.Order: {this.Order}");
            orderedOperations[this.Order] = this;

            TableName tableName = Helper.GetTableName(this.RecordReference.RecordType, this.attributeDecorator);

            this.service.WritePrimitives(writer, tableName.CatalogueName, tableName.Schema, tableName.Name, columnData.AllColumns, this.primaryKeyValues);

            this.service.CopyPrimaryToForeignKeyColumns(columnData.ForeignKeyColumns);

            this.IsWriteDone = true;

            breaker.Pop();

            InsertRecord.Logger.Debug("Exiting Write");
        }