public void CreateDelegate_RaisedPocoFactoryForDomainAggregateList_SharedEntitiesHaveReferenceEquality()
        {
            var definitionProvider = new DataAnnotationsDefinitionProvider();
            var databaseContext    = new Mock <IDatabaseContext>();

            databaseContext.Setup(context => context.GetValueMapper(It.IsAny <Type>(), It.IsAny <Type>())).Returns((IValueMapper)null);

            using (var target = new RaisedPocoFactory(definitionProvider))
            {
                var aggregateOptionRow =
                    new AggregateOptionRow {
                    AggregateOptionId = 3, AggregateOptionTypeId = 4, Name = "Slim Shady", Value = 324.10m
                };

                var topContainerRow = new TopContainerRow
                {
                    Name           = "All TV Evar",
                    TopContainerId = 2
                };

                var tomNJerry = new DomainIdentityRow
                {
                    DomainIdentityId = 23,
                    FirstName        = "Tom",
                    MiddleName       = "N.",
                    LastName         = "Jerry",
                    UniqueIdentifier = "*****@*****.**"
                };

                var mahCatzCategory = new CategoryAttributeRow {
                    CategoryAttributeId = 3, Name = "Mah Catz", IsActive = true, IsSystem = true
                };
                var fooBarCategory = new CategoryAttributeRow {
                    CategoryAttributeId = 4, Name = "foobar", IsActive = true, IsSystem = false
                };

                var porkyPig = new DomainIdentityRow
                {
                    DomainIdentityId = 55,
                    FirstName        = "Porky",
                    MiddleName       = "That's All Folks",
                    LastName         = "Pig",
                    UniqueIdentifier = "*****@*****.**"
                };
                var warnerBros = new SubContainerRow
                {
                    Name           = "Warner Bros",
                    SubContainerId = 234,
                    TopContainerId = 2,
                    TopContainer   = topContainerRow
                };
                var template1 = new TemplateRow {
                    Name = "Template1", TemplateId = 44
                };
                var template2 = new TemplateRow {
                    Name = "Template34", TemplateId = 45
                };
                var expected = new List <DomainAggregateRow>
                {
                    new DomainAggregateRow
                    {
                        DomainAggregateId = 2342,
                        AggregateOption   = aggregateOptionRow,
                        Name = "DomainAg1",
                        CategoryAttribute         = mahCatzCategory,
                        CategoryAttributeId       = mahCatzCategory.CategoryAttributeId,
                        CreatedBy                 = tomNJerry,
                        CreatedByDomainIdentityId = tomNJerry.DomainIdentityId,
                        CreatedTime               = DateTimeOffset.Now.AddDays(-5),
                        Description               = "My First Domain Aggregate YAY",
                        OtherAggregate            =
                            new OtherAggregateRow
                        {
                            OtherAggregateId      = 29,
                            AggregateOptionTypeId = 5,
                            Name = "OtherAggregate"
                        },
                        LastModifiedBy = porkyPig,
                        LastModifiedByDomainIdentityId = porkyPig.DomainIdentityId,
                        LastModifiedTime = DateTimeOffset.Now,
                        SubContainer     = warnerBros,
                        SubContainerId   = warnerBros.SubContainerId,
                        TemplateId       = template1.TemplateId,
                        Template         = template1
                    },
                    new DomainAggregateRow
                    {
                        DomainAggregateId = 2343,
                        AggregateOption   = aggregateOptionRow,
                        Name = "DomainAg2",
                        CategoryAttribute              = mahCatzCategory,
                        CategoryAttributeId            = mahCatzCategory.CategoryAttributeId,
                        CreatedBy                      = tomNJerry,
                        CreatedByDomainIdentityId      = tomNJerry.DomainIdentityId,
                        CreatedTime                    = DateTimeOffset.Now.AddDays(-4),
                        Description                    = "My Second Domain Aggregate YAY",
                        LastModifiedBy                 = porkyPig,
                        LastModifiedByDomainIdentityId = porkyPig.DomainIdentityId,
                        LastModifiedTime               = DateTimeOffset.Now.AddHours(-1),
                        SubContainer                   = warnerBros,
                        SubContainerId                 = warnerBros.SubContainerId,
                        TemplateId                     = template1.TemplateId,
                        Template = template1
                    },
                    new DomainAggregateRow
                    {
                        DomainAggregateId = 2345,
                        AggregateOption   = aggregateOptionRow,
                        Name = "DomainAg3",
                        CategoryAttribute              = fooBarCategory,
                        CategoryAttributeId            = fooBarCategory.CategoryAttributeId,
                        CreatedBy                      = tomNJerry,
                        CreatedByDomainIdentityId      = tomNJerry.DomainIdentityId,
                        CreatedTime                    = DateTimeOffset.Now.AddDays(-2),
                        Description                    = "My Third Domain Aggregate YAY",
                        LastModifiedBy                 = porkyPig,
                        LastModifiedByDomainIdentityId = porkyPig.DomainIdentityId,
                        LastModifiedTime               = DateTimeOffset.Now.AddSeconds(-97),
                        SubContainer                   = warnerBros,
                        SubContainerId                 = warnerBros.SubContainerId,
                        TemplateId                     = template1.TemplateId,
                        Template = template1
                    },
                    new DomainAggregateRow
                    {
                        DomainAggregateId = 2346,
                        AggregateOption   = aggregateOptionRow,
                        Name = "DomainAg4",
                        CategoryAttribute              = fooBarCategory,
                        CategoryAttributeId            = fooBarCategory.CategoryAttributeId,
                        CreatedBy                      = porkyPig,
                        CreatedByDomainIdentityId      = porkyPig.DomainIdentityId,
                        CreatedTime                    = DateTimeOffset.Now.AddDays(-1),
                        Description                    = "My Fourth Domain Aggregate YAY",
                        LastModifiedBy                 = porkyPig,
                        LastModifiedByDomainIdentityId = porkyPig.DomainIdentityId,
                        LastModifiedTime               = DateTimeOffset.Now.AddHours(-3),
                        SubContainer                   = warnerBros,
                        SubContainerId                 = warnerBros.SubContainerId,
                        TemplateId                     = template2.TemplateId,
                        Template = template2
                    },
                    new DomainAggregateRow
                    {
                        DomainAggregateId = 2347,
                        AggregateOption   = aggregateOptionRow,
                        Name = "DomainAg7",
                        CategoryAttribute              = mahCatzCategory,
                        CategoryAttributeId            = mahCatzCategory.CategoryAttributeId,
                        CreatedBy                      = porkyPig,
                        CreatedByDomainIdentityId      = porkyPig.DomainIdentityId,
                        CreatedTime                    = DateTimeOffset.Now.AddDays(-5),
                        Description                    = "My Last Domain Aggregate YAY",
                        LastModifiedBy                 = porkyPig,
                        LastModifiedByDomainIdentityId = porkyPig.DomainIdentityId,
                        LastModifiedTime               = DateTimeOffset.Now.AddMinutes(-16),
                        SubContainer                   = warnerBros,
                        SubContainerId                 = warnerBros.SubContainerId,
                        TemplateId                     = template1.TemplateId,
                        Template = template1
                    }
                };

                var watch            = Stopwatch.StartNew();
                var actual           = new List <DomainAggregateRow>();
                var entityDefinition = definitionProvider.Resolve <DomainAggregateRow>();

                using (var reader = expected.MockDataReaderForList(entityDefinition.ReturnableAttributes.ToList()).Object)
                {
                    while (reader.Read())
                    {
                        actual.Add(target.CreatePoco <DomainAggregateRow>(new PocoDataRequest(reader, entityDefinition, databaseContext.Object)));
                    }
                }

                watch.Stop();
                Trace.TraceInformation($"{watch.Elapsed}");

                Assert.AreEqual(expected.First(), actual.First(), string.Join(Environment.NewLine, expected.First().GetDifferences(actual.First())));

                CollectionAssert.AreEqual(expected, actual);

                Assert.IsTrue(actual.Select(x => x.SubContainer?.TopContainer).All(x => x != null));
                Assert.IsTrue(actual.Select(x => x.SubContainer).All(x => x != null));
                Assert.IsTrue(actual.Select(x => x.Template).All(x => x != null));
                Assert.IsTrue(actual.Select(x => x.CreatedBy).All(x => x != null));
                Assert.IsTrue(actual.Select(x => x.LastModifiedBy).All(x => x != null));
                Assert.IsTrue(actual.Select(x => x.CategoryAttribute).All(x => x != null));
                Assert.IsTrue(actual.Select(x => x.AggregateOption).All(x => x != null));

                foreach (var group in from c in actual.Select(x => x.SubContainer?.TopContainer) group c by c.TopContainerId)
                {
                    Assert.IsTrue(group.All(x => ReferenceEquals(x, group.First())));
                }

                foreach (var group in from c in actual.Select(x => x.SubContainer) group c by c.SubContainerId)
                {
                    Assert.IsTrue(group.All(x => ReferenceEquals(x, group.First())));
                }

                foreach (var group in from t in actual.Select(x => x.Template) group t by t.TemplateId)
                {
                    Assert.IsTrue(group.All(x => ReferenceEquals(x, group.First())));
                }

                foreach (var group in from o in actual.Select(x => x.AggregateOption) group o by o.AggregateOptionId)
                {
                    Assert.IsTrue(group.All(x => ReferenceEquals(x, group.First())));
                }

                foreach (var group in from i in actual.Select(x => x.LastModifiedBy) group i by i.DomainIdentityId)
                {
                    Assert.IsTrue(group.All(x => ReferenceEquals(x, group.First())));
                }

                foreach (var group in from i in actual.Select(x => x.CreatedBy) group i by i.DomainIdentityId)
                {
                    Assert.IsTrue(group.All(x => ReferenceEquals(x, group.First())));
                }

                foreach (var group in from a in actual.Select(x => x.CategoryAttribute) group a by a.CategoryAttributeId)
                {
                    Assert.IsTrue(group.All(x => ReferenceEquals(x, group.First())));
                }
            }
        }
        public void Map_FieldValueListWithSameReferenceParent_ReferenceMaintainedInMapping()
        {
            var target = new AutoMapperEntityMapper(new Mapper(MappingConfigurationProvider));

            var fieldRow = new FieldRow {
                FieldId = 234, Name = "Field1", Description = "The first field"
            };
            var domainIdentity1Row = new DomainIdentityRow {
                DomainIdentityId = 134, FirstName = "Tom", LastName = "Bomb", UniqueIdentifier = "*****@*****.**"
            };
            var domainIdentity2Row = new DomainIdentityRow {
                DomainIdentityId = 765, FirstName = "Tim", LastName = "Bo", UniqueIdentifier = "*****@*****.**"
            };

            var fieldValueRows = new List <FieldValueRow>
            {
                new FieldValueRow
                {
                    Field            = fieldRow,
                    FieldId          = fieldRow.FieldId,
                    FieldValueId     = 93453,
                    LastModifiedTime = DateTimeOffset.Now,
                    LastModifiedBy   = domainIdentity1Row,
                    LastModifiedByDomainIdentifierId = domainIdentity1Row.DomainIdentityId
                },
                new FieldValueRow
                {
                    Field            = fieldRow,
                    FieldId          = fieldRow.FieldId,
                    FieldValueId     = 93454,
                    LastModifiedTime = DateTimeOffset.Now,
                    LastModifiedBy   = domainIdentity1Row,
                    LastModifiedByDomainIdentifierId = domainIdentity1Row.DomainIdentityId
                },
                new FieldValueRow
                {
                    Field            = fieldRow,
                    FieldId          = fieldRow.FieldId,
                    FieldValueId     = 93455,
                    LastModifiedTime = DateTimeOffset.Now,
                    LastModifiedBy   = domainIdentity2Row,
                    LastModifiedByDomainIdentifierId = domainIdentity2Row.DomainIdentityId
                },
                new FieldValueRow
                {
                    Field            = fieldRow,
                    FieldId          = fieldRow.FieldId,
                    FieldValueId     = 93456,
                    LastModifiedTime = DateTimeOffset.Now,
                    LastModifiedBy   = domainIdentity2Row,
                    LastModifiedByDomainIdentifierId = domainIdentity2Row.DomainIdentityId
                },
                new FieldValueRow
                {
                    Field            = fieldRow,
                    FieldId          = fieldRow.FieldId,
                    FieldValueId     = 93457,
                    LastModifiedTime = DateTimeOffset.Now,
                    LastModifiedBy   = domainIdentity2Row,
                    LastModifiedByDomainIdentifierId = domainIdentity2Row.DomainIdentityId
                },
            };

            var values = new List <FieldValue>();

            Trace.WriteLine("test");

            foreach (var row in fieldValueRows)
            {
                values.Add(target.Map <FieldValue>(row));
            }

            var firstField = values.First().Field;

            foreach (var value in values)
            {
                Assert.AreSame(firstField, value.Field);
            }
        }