示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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);
            }
        }
示例#3
0
        /// <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);
            }
        }