public async Task Can_Find_And_Map_Result()
        {
            //Given
            const int itemsCount = 3;
            var       collection = await Database.OnceAndSaveAsync(async db =>
            {
                var collection = new Collection {
                    Name = "A Collection"
                };
                for (var i = 0; i < itemsCount; i++)
                {
                    collection.TodoItems.Add(new TodoItem {
                        Name = $"Item{i}"
                    });
                }
                await db.Collections.AddAsync(collection);
                return(collection);
            });

            //When
            var result = await Database.OnceAsync(async db =>
            {
                var repository = new CollectionRepository(db);

                return(await repository.FindAndMapAsync(collection.Id, c => new
                {
                    Collection = c,
                    TodoItemsCount = c.TodoItems.Count,
                }));
            });

            //Then
            Assert.Equal(collection.Id, result.Collection.Id);
            Assert.Equal(itemsCount, result.TodoItemsCount);
        }
        public async Task Mapped_Found_Collection_Should_Not_Be_Tracked()
        {
            //Given
            const string realName     = "A Collection";
            const int    itemsCount   = 3;
            var          collectionId = await Database.OnceAsync(async db =>
            {
                var repo       = new CollectionRepository(db);
                var collection = new Collection {
                    Name = realName
                };
                for (var i = 0; i < itemsCount; i++)
                {
                    collection.TodoItems.Add(new TodoItem {
                        Name = $"Item{i}"
                    });
                }
                await repo.AddAsync(collection);
                return(collection.Id);
            });

            //When
            await Database.OnceAsync(async db =>
            {
                var repo  = new CollectionRepository(db);
                var found = await repo.FindAndMapAsync(collectionId, collection => new
                {
                    Collection     = collection,
                    TodoItemsCount = collection.TodoItems.Count,
                });

                Assert.Equal(itemsCount, found.TodoItemsCount);

                found.Collection.Name = "Manipulated Name";
                await db.SaveChangesAsync();
            });

            //Then
            var result = await Database.OnceAsync(async db =>
                                                  await db.Collections.FindAsync(collectionId));

            Assert.Equal(realName, result.Name);
        }