/// <summary>
        /// Loads LOT-based addresses to database.
        /// </summary>
        /// <param name="filepaths">List of XML document paths.</param>
        private void LoadLotBasedAddresses(IEnumerable <string> filepaths)
        {
            var serialiser = new XmlSerializer(typeof(LotBasedAddresses));

            foreach (var filepath in filepaths)
            {
                var filename = ConversionHelper.GetFilenameFromFilepath(filepath, this._settings);

                using (var context = new KoreanPostcodeAddressDataContext())
                {
                    this.OnStatusChanged(new StatusChangedEventArgs(String.Format("Loading a file - {0} - to database", filename)));

                    using (var stream = new FileStream(filepath, FileMode.Open))
                    {
                        var collection = (LotBasedAddresses)serialiser.Deserialize(stream);
                        foreach (var address in collection.LotBasedAddress
                                 .Select(p => new LotBasedAddress()
                        {
                            Postcode = ConversionHelper.ConvertToString(p.Postcode),
                            SequenceNumber = ConversionHelper.ConvertToInt32(p.SequenceNumber),
                            Province = ConversionHelper.GetProvince(p.Province),
                            City = ConversionHelper.GetCity(p.Province),
                            County = ConversionHelper.GetCounty(p.Province, p.County),
                            District = ConversionHelper.GetDistrict(p.Province, p.County),
                            Suburb = ConversionHelper.GetSuburb(p.Suburb),
                            Village = ConversionHelper.GetVillage(p.Village),
                            Island = ConversionHelper.GetIsland(p.Island),
                            San = ConversionHelper.GetSan(p.San),
                            LotNumberMajorFrom = ConversionHelper.ConvertToNullableInt32(p.LotNumberMajorFrom),
                            LotNumberMinorFrom = ConversionHelper.ConvertToNullableInt32(p.LotNumberMinorFrom),
                            LotNumberMajorTo = ConversionHelper.ConvertToNullableInt32(p.LotNumberMajorTo),
                            LotNumberMinorTo = ConversionHelper.ConvertToNullableInt32(p.LotNumberMinorTo),
                            BuildingName = ConversionHelper.ConvertToString(p.BuildingName),
                            BuildingNumberFrom = ConversionHelper.ConvertToNullableInt32(p.BuildingNumberFrom),
                            BuildingNumberTo = ConversionHelper.ConvertToNullableInt32(p.BuildingNumberTo),
                            DateUpdated = p.DateUpdated,
                            Address = ConversionHelper.ConvertToString(p.Address)
                        }))
                        {
                            context.LotBasedAddresses.AddObject(address);
                        }
                    }
                    context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

                    this.OnStatusChanged(new StatusChangedEventArgs(String.Format("Loaded the file - {0} - to database", filename)));
                }
            }
        }
        /// <summary>
        /// Loads extracted XML files to database.
        /// </summary>
        /// <param name="sourceDirectory">Source directory where the XML files are located.</param>
        /// <param name="serviceType">Converter service type.</param>
        private void LoadDatabase(string sourceDirectory, ConverterServiceType serviceType)
        {
            using (var context = new KoreanPostcodeAddressDataContext())
            {
                //  Drops and recreates tables.
                context.DropCreateTables(Convert.ToString(serviceType));
            }

            IList <string> filepaths;

            switch (serviceType)
            {
            case ConverterServiceType.Lot:
                filepaths = Directory.GetFiles(sourceDirectory).Where(p => p.EndsWith(".xml")).ToList();
                this.LoadLotBasedAddresses(filepaths);
                break;

            case ConverterServiceType.Street:
                filepaths = Directory.GetFiles(sourceDirectory).Where(p => p.EndsWith(".txt")).ToList();
                this.LoadStreetBasedAddresses(filepaths);
                break;
            }
        }
        /// <summary>
        /// Loads street-based addresses to database.
        /// </summary>
        /// <param name="filepaths">List of XML document paths.</param>
        private void LoadStreetBasedAddresses(IEnumerable <string> filepaths)
        {
            foreach (var filepath in filepaths)
            {
                var filename = ConversionHelper.GetFilenameFromFilepath(filepath, this._settings);

                using (var context = new KoreanPostcodeAddressDataContext())
                {
                    this.OnStatusChanged(new StatusChangedEventArgs(String.Format("Loading a file - {0} - to database", filename)));

                    var csv = new DelimitedFileEngine <Aliencube.Utilities.KoreanPostcodeAddressConverter.Services.Models.StreetBasedAddress>()
                    {
                        Encoding = Encoding.GetEncoding(949)
                    };
                    csv.AfterReadRecord         += Csv_AfterReadRecord;
                    csv.Options.Delimiter        = "|";
                    csv.Options.IgnoreFirstLines = 1;

                    //  Loads objects directly from the CSV file.
                    var addresses = csv.ReadFile(filepath);

                    var blockSize = this._settings.GetProcessRequests <int>("databaseLoadingBlockSize");
                    var block     = (int)Math.Ceiling((double)addresses.Length / blockSize);
                    for (var i = 0; i < block; i++)
                    {
                        this.OnStatusChanged(new StatusChangedEventArgs(String.Format("Loading a file - {0} - to database ({1}/{2})", filename, i + 1, block)));

                        var records = i < block - 2
                                          ? blockSize
                                          : addresses.Length - (i * block);
                        foreach (var address in addresses.Skip(i * (int)blockSize)
                                 .Take((int)records)
                                 .Select(p => new StreetBasedAddress()
                        {
                            Postcode = ConversionHelper.ConvertToString(p.Postcode),
                            SequenceNumber = ConversionHelper.ConvertToString(p.SequenceNumber),
                            Province = ConversionHelper.GetProvince(p.Province),
                            ProvinceEng = ConversionHelper.GetProvinceEng(p.ProvinceEng),
                            City = ConversionHelper.GetCity(p.Province),
                            CityEng = ConversionHelper.GetCityEng(p.ProvinceEng),
                            County = ConversionHelper.GetCounty(p.Province, p.County),
                            CountyEng = ConversionHelper.GetCountyEng(p.ProvinceEng, p.CountyEng),
                            District = ConversionHelper.GetDistrict(p.Province, p.County),
                            DistrictEng = ConversionHelper.GetDistrictEng(p.ProvinceEng, p.CountyEng),
                            Suburb = ConversionHelper.GetSuburb(p.Suburb),
                            SuburbEng = ConversionHelper.GetSuburbEng(p.SuburbEng),
                            StreetNameCode = ConversionHelper.ConvertToString(p.StreetNameCode),
                            StreetName = ConversionHelper.GetStreet(p.StreetName, p.StreetNameEng),
                            StreetNameEng = ConversionHelper.GetStreetEng(p.StreetNameEng),
                            Basement = ConversionHelper.ConvertToNullableInt32(p.Basement),
                            BuildingNumberMajor = ConversionHelper.ConvertToNullableInt32(p.BuildingNumberMajor),
                            BuildingNumberMinor = ConversionHelper.ConvertToNullableInt32(p.BuildingNumberMinor),
                            BuildingCode = ConversionHelper.ConvertToString(p.BuildingCode),
                            BuildingNameForBulk = ConversionHelper.ConvertToString(p.BuildingNameForBulk),
                            BuildingName = ConversionHelper.ConvertToString(p.BuildingName),
                            RegisteredSuburbCode = ConversionHelper.ConvertToString(p.RegisteredSuburbCode),
                            RegisteredSuburb = ConversionHelper.GetSuburb(p.RegisteredSuburb),
                            SuburbSequenceNumber = ConversionHelper.ConvertToNullableInt32(p.SuburbSequenceNumber),
                            Village = ConversionHelper.GetVillage(p.Village),
                            San = ConversionHelper.ConvertToNullableBoolean(p.San),
                            LotNumberMajor = ConversionHelper.ConvertToNullableInt32(p.LotNumberMajor),
                            LotNumberMinor = ConversionHelper.ConvertToNullableInt32(p.LotNumberMinor)
                        }))
                        {
                            context.StreetBasedAddresses.AddObject(address);
                        }
                        context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

                        this.OnStatusChanged(new StatusChangedEventArgs(String.Format("Loaded the file - {0} - to database ({1}/{2})", filename, i + 1, block)));
                    }
                }
            }
        }