public override void CreateSite(Site site)
        {
            if (site.Region == null)
            {
                throw new ArgumentNullException("site", "Region is null");
            }
            if (site.SiteType == null)
            {
                throw new ArgumentNullException("site", "SiteType is null");
            }
            if (string.IsNullOrEmpty(site.Name))
            {
                throw new ProviderException("Site name cannot be empty or null.");
            }
            if (site.Name.IndexOf(',') > 0)
            {
                throw new ArgumentException("Site names cannot contain commas.");
            }
            if (GetSiteByName(site.Name) != null)
            {
                throw new ProviderException("Site name already exists.");
            }

            using (var transaction = new TransactionScope(_configuration))
            {
                if (!RegionExists(site.Region))
                {
                    CreateRegion(site.Region);
                }
                else
                {
                    site.Region = GetRegionByName(site.Region.Name);
                }

                if (!SiteTypeExists(site.SiteType))
                {
                    CreateSiteType(site.SiteType);
                }
                else
                {
                    site.SiteType = GetSiteTypeByName(site.SiteType.Name);
                }

                //if (site.PhysicalAddress == null || string.IsNullOrEmpty(site.PhysicalAddress.Address1))
                //    site.PhysicalAddress = new Address.Address();
                //if (site.PostalAddress == null || string.IsNullOrEmpty(site.PostalAddress.Address1))
                //    site.PostalAddress = new Address.Address();
                if (site.PhysicalAddress != null)
                {
                    if (string.IsNullOrEmpty(site.PhysicalAddress.Id))
                    {
                        if (!string.IsNullOrEmpty(site.PhysicalAddress.Address1))
                        {
                            Address currentAddress = AddressManager.GetAddressByDetails(site.PhysicalAddress.Address1,
                                                                                        site.PhysicalAddress.Address2,
                                                                                        site.PhysicalAddress.Suburb,
                                                                                        site.PhysicalAddress.Postcode,
                                                                                        site.PhysicalAddress.State);
                            if (currentAddress == null)
                            {
                                AddressManager.CreateAddress(site.PhysicalAddress);
                            }
                            else
                            {
                                site.PhysicalAddress = currentAddress;
                            }
                        }
                    }
                }
                if (site.PostalAddress != null)
                {
                    if (string.IsNullOrEmpty(site.PostalAddress.Id))
                    {
                        if (!string.IsNullOrEmpty(site.PostalAddress.Address1))
                        {
                            Address currentAddress = AddressManager.GetAddressByDetails(site.PostalAddress.Address1,
                                                                                        site.PostalAddress.Address2,
                                                                                        site.PostalAddress.Suburb,
                                                                                        site.PostalAddress.Postcode,
                                                                                        site.PostalAddress.State);
                            if (currentAddress == null)
                            {
                                AddressManager.CreateAddress(site.PostalAddress);
                            }
                            else
                            {
                                site.PostalAddress = currentAddress;
                            }
                        }
                    }
                }

                var ptDs = new SiteDataStore(transaction);
                ptDs.Insert(site);
                transaction.Commit();
            }
        }