public TableInheritanceDemoDBResultSet SubmitChanges(ClientInfo clientInfo, TableInheritanceDemoDBChangeSet changeSet)
        {
            var resultSet = new TableInheritanceDemoDBResultSet(changeSet);

            using (var transactionScope = CreateSavingTransactionScope())
            {
                using (var dataRepository = _repositoryFactory(clientInfo))
                {
                    // optional custom processing
                    PreProcessing(clientInfo, ref changeSet, dataRepository);

                    // apply chnages to repository
                    ApplyChanges(dataRepository, dataRepository.People, changeSet, changeSet.People, clientInfo);
                    ApplyChanges(dataRepository, dataRepository.Addresses, changeSet, changeSet.Addresses, clientInfo);
                    ApplyChanges(dataRepository, dataRepository.Demographics, changeSet, changeSet.Demographics, clientInfo);
                    ApplyChanges(dataRepository, dataRepository.EmployeeRoles, changeSet, changeSet.EmployeeRoles, clientInfo);

                    // optional custom processing
                    BeforeSaving(clientInfo, ref changeSet, dataRepository);

                    // save changes
                    SaveChanges(dataRepository, changeSet, resultSet);

                    // optional custom processing
                    PostProcessing(clientInfo, ref resultSet, dataRepository);
                }
                transactionScope.Complete();
            }
            return(resultSet);
        }
        public TableInheritanceDemoDBChangeSet CreateChangeSet(IEnumerable <Person> people, IEnumerable <Address> addresses, IEnumerable <Demographic> demographics, IEnumerable <EmployeeRole> employeeRoles)
        {
            // retrieve changes sets (modified entities)
            var personChangeSet       = GetChangeSet(people);
            var addressChangeSet      = GetChangeSet(addresses);
            var demographicChangeSet  = GetChangeSet(demographics);
            var employeeRoleChangeSet = GetChangeSet(employeeRoles);

            // reduce entities (copy changed values)
            var peopleMap        = ReduceToModifications(personChangeSet);
            var addressesMap     = ReduceToModifications(addressChangeSet);
            var demographicsMap  = ReduceToModifications(demographicChangeSet);
            var employeeRolesMap = ReduceToModifications(employeeRoleChangeSet);

            // fixup relations (replaces related entities with reduced entites)
            FixupRelations(
                CastToEntityTuple(peopleMap),
                CastToEntityTuple(addressesMap),
                CastToEntityTuple(demographicsMap),
                CastToEntityTuple(employeeRolesMap)
                );

            var changeSet = new TableInheritanceDemoDBChangeSet();

            if (peopleMap.Count > 0)
            {
                changeSet.People = peopleMap.Select(e => e.ReducedEntity).ToList();
            }
            if (addressesMap.Count > 0)
            {
                changeSet.Addresses = addressesMap.Select(e => e.ReducedEntity).ToList();
            }
            if (demographicsMap.Count > 0)
            {
                changeSet.Demographics = demographicsMap.Select(e => e.ReducedEntity).ToList();
            }
            if (employeeRolesMap.Count > 0)
            {
                changeSet.EmployeeRoles = employeeRolesMap.Select(e => e.ReducedEntity).ToList();
            }

            return(changeSet);
        }
 partial void BeforeSaving(ClientInfo clientInfo, ref TableInheritanceDemoDBChangeSet changeSet, ITableInheritanceDemoDBRepository repository);
 partial void PreProcessing(ClientInfo clientInfo, ref TableInheritanceDemoDBChangeSet changeSet, ITableInheritanceDemoDBRepository repository);