/// <summary> /// Delete a container from the data source /// </summary> /// <param name="o">The container to delete</param> /// <param name="bypassChecks">Whether to bypass any checks made to stop deletion by a front end user</param> public void Delete(object o, bool bypassChecks) { using (var dataSource = DataSourceFactory.Create(false)) { var idProp = LinqX.GetIdProp(o.GetType(), this.IdName); object noId = ReflectionX.GetDefault(idProp.PropertyType); var eventData = new RepositoryEventData(o, bypassChecks); var eventResult = EventHub.Instance.ProcessEvent("Repository.Set.Delete", this, eventData); var itemDel = ((RepositoryEventData)eventResult.Data).Container; bool wasHandled = ((RepositoryEventData)eventResult.Data).WasHandled; if (itemDel != null) { if (eventResult.EventName.EndsWith("Add")) { DoAdd(dataSource, itemDel, idProp, wasHandled); } else if (eventResult.EventName.EndsWith("Update") && !wasHandled) { dataSource.Update(itemDel); } else if (!wasHandled) { dataSource.Delete(itemDel); } if (!wasHandled) { dataSource.SaveChanges(); } } var savedEventData = new RepositoryEventData(o, bypassChecks); EventHub.Instance.ProcessEvent(eventResult.EventName.Replace("Set", "Saved"), this, savedEventData); } }
/// <summary> /// Delete a container from the data source /// </summary> /// <param name="o">The container to delete</param> /// <param name="bypassChecks">Whether to bypass any checks made to stop deletion by a front end user</param> public void Delete(object o, bool bypassChecks) { var db = GetDb(); try { var idProp = LinqX.GetIdProp(o.GetType(), this.IdName); object noId = ReflectionX.GetDefault(idProp.PropertyType); var eventData = new RepositoryEventData(o, bypassChecks); var eventResult = EventHub.Instance.ProcessEvent("Repository.Set.Delete", this, eventData); var itemDel = ((RepositoryEventData)eventResult.Data).Container; bool wasHandled = ((RepositoryEventData)eventResult.Data).WasHandled; if (itemDel != null) { if (eventResult.EventName.EndsWith("Add")) { DoAdd(db, itemDel, idProp, wasHandled); } else if (eventResult.EventName.EndsWith("Update") && !wasHandled) { db.Entry(itemDel).State = EntityState.Modified; } else if (!wasHandled) { db.Entry(itemDel).State = EntityState.Deleted; } if (!wasHandled) { db.SaveChanges(); } } var savedEventData = new RepositoryEventData(o, bypassChecks); EventHub.Instance.ProcessEvent(eventResult.EventName.Replace("Set", "Saved"), this, savedEventData); } finally { EndCallDb(db); } }
/// <summary> /// Set (create or update) a list of containers to the data source /// </summary> /// <param name="items">The list of containers</param> /// <param name="setOptions">Options for setting</param> /// <returns>List of flags for whether the corresponding by position item was created (rather than updated)</returns> public virtual List <bool> Set(List <object> items, Dictionary <string, object> setOptions) { var db = GetDb(); var createds = new List <bool>(); bool?create = setOptions.Get <bool?>("create"); bool bypassChecks = setOptions.Get <bool>("bypassChecks", false); bool anyUnhandled = false; try { var savedItems = new List <Tuple <object, bool> >(); foreach (object item in items) { var idProp = LinqX.GetIdProp(item.GetType(), this.IdName); bool isAdd; if (create == null) { object noId = ReflectionX.GetDefault(idProp.PropertyType); isAdd = idProp.GetValue(item).Equals(noId); } else { isAdd = create.Value; } var eventData = new RepositoryEventData(item, bypassChecks); var eventResult = EventHub.Instance.ProcessEvent("Repository.Set." + (isAdd ? "Add" : "Update"), this, eventData); var itemSave = ((RepositoryEventData)eventResult.Data).Container; bool wasHandled = ((RepositoryEventData)eventResult.Data).WasHandled; if (!wasHandled) { anyUnhandled = true; } isAdd = eventResult.EventName.EndsWith("Add"); if (isAdd) { DoAdd(db, itemSave, idProp, wasHandled); } else if (!wasHandled) { db.Entry(itemSave).State = EntityState.Modified; } savedItems.Add(Tuple.Create(itemSave, isAdd)); createds.Add(isAdd); } if (savedItems.Count > 0 && anyUnhandled) { db.SaveChanges(); } foreach (var savedItem in savedItems) { var eventData = new RepositoryEventData(savedItem.Item1, bypassChecks); EventHub.Instance.ProcessEvent("Repository.Saved." + (savedItem.Item2 ? "Add" : "Update"), this, eventData); } return(createds); } finally { EndCallDb(db); } }