public string Save() { string result = "true"; try { var safeCitationID = this.SafeCitationID; using (var context = new SafeEntities()) { Safe_Citations safeCitation; if (this.SafeCitationID == 0) { safeCitation = new Safe_Citations(); } else { safeCitation = (from c in context.Safe_Citations where c.SafeCitationID == safeCitationID select c).Single(); } PropertyInfo[] props = safeCitation.GetType().GetProperties(); foreach (PropertyInfo prop in props) { if (prop.GetGetMethod().IsVirtual) { //if (prop.PropertyType.Name.Contains("ICollection")) //{ // // get static save method // MethodInfo saveMethod = prop.GetType().GetMethod("Save", BindingFlags.Static | BindingFlags.Public); // // call save method and pass it the collection // saveMethod.Invoke(null, new object[] {(object) prop.GetValue(this, null)}); //} //else //{ // continue; //} continue; } var val = this.GetType().GetProperty(prop.Name).GetValue(this, null); prop.SetValue(safeCitation, val, null); } if (SafeCitationID == 0) { context.Safe_Citations.Add(safeCitation); } try { var saveFlag = true; #region Validate string errorMessage = string.Empty; var validationErrors = context.GetValidationErrors() .Where(vr => !vr.IsValid) .SelectMany(vr => vr.ValidationErrors).ToList(); // Check for duplicate citation number. if (SafeCitationID == 0) { var citationNumberAlreadyExists = (from c in context.Safe_Citations where c.CitationNumber == safeCitation.CitationNumber select c).Any(); if (citationNumberAlreadyExists) { validationErrors.Add(new DbValidationError("CitationNumber", "You entered a duplicate citation number. Either modify the citation number or edit the existing citation.")); } } if (Safe_CitationViolations.Count() < 1) { validationErrors.Add(new DbValidationError("Safe_CitationViolations", "At least one violation is required.")); } if (Safe_CitationPoliceOfficers.Count() < 1 && safeCitation.Superintendent == "") { validationErrors.Add(new DbValidationError("Safe_CitationPoliceOfficers", "At least one officer or a superintendent is required.")); } foreach (var error in validationErrors) { saveFlag = false; errorMessage += error.ErrorMessage + "</br>"; } #endregion // Save Collections if (saveFlag) { context.SaveChanges(); if (this.WhenDue != null) { foreach (Safe_CitationViolations violation in Safe_CitationViolations) { if (violation.Safe_ViolationTypes.ViolationTypeDescription == "Equipment") { violation.ViolationPoints = 0; violation.Safe_Violations.ViolationPoints = 0; } } } SAFE.Safe_CitationViolations.Save(Safe_CitationViolations, safeCitation.SafeCitationID); SAFE.Safe_CitationPoliceOfficers.Save(Safe_CitationPoliceOfficers, safeCitation.SafeCitationID); SAFE.Documents.Save(this.Documents, safeCitation.SafeCitationID); SAFE.Safe_Hearings.Save(Safe_Hearings, safeCitation.SafeCitationID); context.SaveChanges(); if (this.SafeCitationID == 0) { this.SafeCitationID = safeCitation.SafeCitationID; } return("true"); } else { return(errorMessage); } } catch (Exception ex) { result = ((ex.InnerException).InnerException).Message; } } } catch (Exception ex) { result = "ERROR:\n\r\n\r" + ex.Message + " INNER EXCEPTION: " + ((ex.InnerException).InnerException).Message; } return(result); }
public static bool Save(ICollection <Safe_CitationPoliceOfficers> citationPoliceOfficers, int safeCitationID) { bool result = false; try { using (var context = new SafeEntities()) { #region Get SafeCitationID var tmp = from c in citationPoliceOfficers select c; var citationId = safeCitationID; #endregion #region Get List of items to delete var ids = from id in citationPoliceOfficers select new { id.OfficerBadgeID }; var idList = ids.Select(item => item.OfficerBadgeID).ToList(); var deleteList = from d in context.Safe_CitationPoliceOfficers where d.SafeCitationID == citationId && !idList.Contains(d.OfficerBadgeID) select d; #endregion #region Remove deleted items foreach (var item in deleteList) { context.Safe_CitationPoliceOfficers.Remove(item); } #endregion #region Update changes var updateList = from d in context.Safe_CitationPoliceOfficers where d.SafeCitationID == citationId && idList.Contains(d.OfficerBadgeID) select d; foreach (var item in updateList) { var theItem = item; // find matching record from param var records = from record in citationPoliceOfficers where record.OfficerBadgeID == theItem.OfficerBadgeID select record; Safe_CitationPoliceOfficers sourceRecord = records.FirstOrDefault(); PropertyInfo[] props = theItem.GetType().GetProperties(); Array.ForEach(props, prop => { if (!prop.GetGetMethod().IsVirtual&& prop.Name != "C_DataChanges_RowID") { var value = prop.GetValue(sourceRecord, null); prop.SetValue(theItem, value, null); } }); theItem.SafeCitationID = citationId; } #endregion #region Add new items var adds = from d in context.Safe_CitationPoliceOfficers where d.SafeCitationID == citationId select d; var addIds = adds.Select(item => item.OfficerBadgeID).ToList(); var addRecords = from addRecord in citationPoliceOfficers where !addIds.Contains(addRecord.OfficerBadgeID) select addRecord; foreach (var item in addRecords) { var theItem = item; var newRecord = new Safe_CitationPoliceOfficers(); PropertyInfo[] props = theItem.GetType().GetProperties(); Array.ForEach(props, prop => { if (!prop.GetGetMethod().IsVirtual) { var value = prop.GetValue(theItem, null); prop.SetValue(newRecord, value, null); } }); newRecord.SafeCitationID = citationId; context.Safe_CitationPoliceOfficers.Add(newRecord); } #endregion try { context.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { string message = string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); Trace.TraceInformation(message); } } } } result = true; } catch (Exception ex) { Exception theException = ex; while (theException.InnerException != null) { theException = theException.InnerException; } throw theException; } return(result); }