/// <summary>
        /// Saves the model.
        /// </summary>
        /// <returns>Weather the operation succeeded</returns>
        public bool SaveAll()
        {
            using (IDbTransaction tx = Database.OpenTransaction()) {
                List <object> args  = new List <object>();
                string        sql   = "";
                var           isNew = Template.IsNew;

                // Delete all unattached properties
                args.Add(Template.Id);
                Template.Properties.Each((n, p) => {
                    sql += (sql != "" ? "," : "") + "@" + (n + 1).ToString();
                    args.Add(p);
                });
                Property.Execute("DELETE FROM property WHERE property_parent_id IN (" +
                                 "SELECT page_id FROM page WHERE page_template_id = @0) " +
                                 (sql != "" ? "AND property_name NOT IN (" + sql + ")" : ""), tx, args.ToArray());

                // Save the template
                Template.Save(tx);

                // Update all regiontemplates with the id if this is an insert
                if (isNew)
                {
                    Regions.ForEach(r => r.TemplateId = Template.Id);
                }

                // Delete removed regions templates
                sql = "";
                args.Clear();
                args.Add(Template.Id);
                var pos = 1;
                foreach (var reg in Regions)
                {
                    if (reg.Id != Guid.Empty)
                    {
                        sql += (sql != "" ? "," : "") + "@" + pos.ToString();
                        args.Add(reg.Id);
                        pos++;
                    }
                }
                RegionTemplate.Execute("DELETE FROM regiontemplate WHERE regiontemplate_template_id = @0 " +
                                       (sql != "" ? "AND regiontemplate_id NOT IN (" + sql + ")" : ""), tx, args.ToArray());
                // Save the regions
                foreach (var reg in Regions)
                {
                    reg.Save(tx);
                }
                tx.Commit();
            }
            // Reload regions
            Regions = RegionTemplate.Get("regiontemplate_template_id = @0", Template.Id,
                                         new Params()
            {
                OrderBy = "regiontemplate_seqno"
            });

            return(true);
        }