/// <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); }