예제 #1
0
        public async Task ExecuteAsync_TableValueInsertForFields_DoesNotThrowException()
        {
            var internalId = new Field
            {
                Name        = "INS_Internal ID",
                Description = "Unique ID used internally"
            };

            var firstName = new Field
            {
                Name        = "INS_First Name",
                Description = "The person's first name"
            };

            var lastName = new Field
            {
                Name        = "INS_Last Name",
                Description = "The person's last name"
            };

            var yearlyWage = new Field
            {
                Name        = "INS_Yearly Wage",
                Description = "The base wage paid year over year."
            };

            var hireDate = new Field
            {
                Name        = "INS_Hire Date",
                Description = "The date and time of hire for the person"
            };

            var bonusTarget = new Field
            {
                Name        = "INS_Bonus Target",
                Description = "The target bonus for the person"
            };

            var contactNumbers = new Field
            {
                Name        = "INS_Contact Numbers",
                Description = "A list of contact numbers for the person in order of preference"
            };

            var fields = new List <Field>
            {
                internalId,
                firstName,
                lastName,
                yearlyWage,
                hireDate,
                bonusTarget,
                contactNumbers
            };

            var providerFactory   = new SqlClientProviderFactory(new DataAnnotationsDefinitionProvider());
            var cancellationToken = CancellationToken.None;

            await using (var provider = providerFactory.Create(ConfigurationRoot.GetConnectionString("OrmTestDb")))
            {
                var transaction = await provider.BeginTransactionAsync(cancellationToken).ConfigureAwait(false);

                // Set up the structured command provider.
                var fieldRepository      = new EntityRepository <Field, FieldRow>(provider, this.mapper);
                var fieldValueRepository = new EntityRepository <FieldValue, FieldValueRow>(provider, this.mapper);

                // Delete the existing rows.
                var fieldSelection = Query.Select <FieldRow>().Where(set => set.AreEqual(row => row.Name, "INS_%"));
                var existingFields = new List <Field>();

                await foreach (var item in fieldRepository.SelectEntitiesAsync(fieldSelection, cancellationToken).ConfigureAwait(false))
                {
                    existingFields.Add(item);
                }

                await fieldValueRepository.DeleteSelectionAsync(
                    Query.Select <FieldValueRow>()
                    .Where(set => set.Include(row => row.FieldId, existingFields.Select(field => field.FieldId).ToArray())),
                    cancellationToken)
                .ConfigureAwait(false);

                await fieldRepository.DeleteSelectionAsync(fieldSelection, cancellationToken).ConfigureAwait(false);

                var fieldInsertCommand = new TableValuedInsert <FieldRow>(provider.DatabaseContext);

                await fieldInsertCommand.ExecuteAsync(
                    fields.Select(
                        field => new FieldTableTypeRow
                {
                    Name        = field.Name,
                    Description = field.Description
                }),
                    cancellationToken)
                .ConfigureAwait(false);

                await transaction.CommitAsync(cancellationToken).ConfigureAwait(false);
            }
        }