public void Should_Fill_Number_When_Number_Property_Is_Empty()
        {
            //Arrange
            var dateTime = new DateTime(2021, 1, 1);
            var provider = BuildServiceProvider(dateTime);

            //Act, Assert
            provider.RunScoped <IDbContext>(dbContext =>
            {
                using var transaction = dbContext.BeginTransaction();
                var task1             = new NumberingTestEntity
                {
                    DateTime = dateTime,
                    BranchId = 1
                };
                var task2 = new NumberingTestEntity
                {
                    DateTime = dateTime,
                    BranchId = 1
                };
                dbContext.Set <NumberingTestEntity>().Add(task1);
                dbContext.Set <NumberingTestEntity>().Add(task2);
                dbContext.SaveChanges();

                task1.Number.ShouldBe("Prefix-100");

                task2.Number.ShouldBe("Prefix-105");

                dbContext.Set <NumberedEntity>().Any(_ => _.EntityName == $"{typeof(NumberingTestEntity).FullName}")
                .ShouldBeTrue();

                transaction.Commit();
            });
        }
        public void Should_Fill_All_NumberingFields_BasedOn_NumberingOptions()
        {
            //Arrange
            var dateTime = new DateTime(2021, 1, 1);
            var provider = BuildServiceProvider(dateTime);

            //Act, Assert
            provider.RunScoped <IDbContext>(dbContext =>
            {
                using var transaction = dbContext.BeginTransaction();
                var task1             = new NumberingTestEntity
                {
                    DateTime = dateTime,
                    BranchId = 1
                };
                var task2 = new NumberingTestEntity
                {
                    DateTime = dateTime,
                    BranchId = 1
                };
                dbContext.Set <NumberingTestEntity>().Add(task1);
                dbContext.Set <NumberingTestEntity>().Add(task2);
                dbContext.SaveChanges();

                task1.Number.ShouldBe("Prefix-100");
                task1.NumberBasedOnBranchId.ShouldBe("10");
                task1.NumberBasedOnBranchIdDateTime.ShouldBe("1");
                task1.NumberBasedOnBranchIdCreatedDateTime.ShouldBe("1");

                task2.Number.ShouldBe("Prefix-105");
                task2.NumberBasedOnBranchId.ShouldBe("20");
                task2.NumberBasedOnBranchIdDateTime.ShouldBe("2");
                task2.NumberBasedOnBranchIdCreatedDateTime.ShouldBe("2");

                dbContext.Set <NumberedEntity>().Any(_ => _.EntityName == $"{typeof(NumberingTestEntity).FullName}")
                .ShouldBeTrue();
                dbContext.Set <NumberedEntity>()
                .Any(_ => _.EntityName == $"{typeof(NumberingTestEntity).FullName}_BranchId_1")
                .ShouldBeTrue();
                dbContext.Set <NumberedEntity>()
                .Any(_ => _.EntityName == $"{typeof(NumberingTestEntity).FullName}_BranchId_1_DateTime_20210101")
                .ShouldBeTrue();
                dbContext.Set <NumberedEntity>()
                .Any(_ => _.EntityName ==
                     $"{typeof(NumberingTestEntity).FullName}_BranchId_1_CreatedDateTime_20210101")
                .ShouldBeTrue();
                dbContext.Set <NumberedEntity>()
                .Any(_ => _.EntityName ==
                     $"{typeof(NumberingTestEntity).FullName}_BranchId_1_CreatedDateTime_20210101" &&
                     _.NextValue == 3)
                .ShouldBeTrue();
                transaction.Commit();
            });
        }
        Should_Fill_Numbers_Without_Gap_When_Concurrent_Transactions_Want_Insert_Instance_Of_INumberedEntity()
        {
            //Arrange
            var dateTime = new DateTime(2021, 1, 1);
            var provider = BuildServiceProvider(dateTime);

            //Act
            ExecuteInParallel(delegate
            {
                provider.RunScoped <IDbContext>(dbContext =>
                {
                    using var transaction = dbContext.BeginTransaction();
                    var task = new NumberingTestEntity {
                        DateTime = dateTime
                    };
                    dbContext.Set <NumberingTestEntity>().Add(task);
                    dbContext.SaveChanges();

                    transaction.Commit();
                });
            });