コード例 #1
0
        /// <summary>
        /// Save (insert/update) a Widget into the store
        /// </summary>
        /// <param name="entitiesBeingHandled">Entities already being saved further up the save stack</param>
        /// <param name="widgets">The Widgets to save</param>
        /// <param name="toSave">Entity types to cascade to, if they are loaded</param>
        internal void Save(List <Entity> entitiesBeingHandled, Flags toSave, params Widget[] widgets)
        {
            if (widgets == null)
            {
                throw new ArgumentNullException("widgets");
            }
            Log("Save", widgets.Select <Widget, int>(entity => entity.Identity).ToArray <int>(), EntityType.None);

            // Copy the list of entities being handled, and add this new set of entities to it.
            // We're handling those now.
            List <Entity> entitiesNowBeingHandled = new List <Entity>(entitiesBeingHandled);

            entitiesNowBeingHandled.AddRange(widgets);

            // Loop over each entity and save it.
            foreach (Widget widget in widgets)
            {
                // Already being saved higher up the stack?
                if (entitiesBeingHandled.ContainsEntity(widget))
                {
                    continue;
                }

                // Allow derived/partial class to do extra work
                OnBeforeSaveEntity(widget);

                // Save parent entity... so we can update our key to it
                if ((toSave & EntityType.Thing) == EntityType.Thing &&
                    widget.ThingPopulated)
                {
                    if (!entitiesBeingHandled.ContainsEntity(widget.Thing))
                    {
                        ThingRepo.Save(entitiesNowBeingHandled, toSave, widget.Thing);
                        widget.ThingId = widget.Thing.Identity;
                    }
                }

                bool saved = false;

                try
                {
                    // Save the entity
                    if (widget.IsNew)
                    {
                        this.Mapper.Insert("InsertWidget", widget);
                        saved = true;
                    }
                    else if (widget.IsChanged)
                    {
                        if (this.Mapper.Update("UpdateWidget", widget) != 1)
                        {
                            ThrowWidgetEntityException(widget.Identity);
                        }
                        saved = true;
                    }
                }
                catch (Exception ex)
                {
                    throw EntityLogger.WriteUnexpectedException(
                              ex,
                              "Failed to insert/update Entity",
                              Category.EntityFramework,
                              widget);
                }

                // Save child entities... update their key to us
                if ((toSave & EntityType.FieldTest) == EntityType.FieldTest &&
                    widget.FieldTestListUsingForeignKeyFieldPopulated)
                {
                    foreach (FieldTest childFieldTest in widget.FieldTestListUsingForeignKeyField)
                    {
                        childFieldTest.ForeignKeyField = widget.Identity;
                        if (!entitiesBeingHandled.ContainsEntity(childFieldTest))
                        {
                            if (childFieldTest.IsDeleted)
                            {
                                FieldTestRepo.Delete(entitiesNowBeingHandled, toSave, childFieldTest);
                            }
                            else
                            {
                                FieldTestRepo.Save(entitiesNowBeingHandled, toSave, childFieldTest);
                            }
                        }
                    }
                }

                // Save child entities... update their key to us
                if ((toSave & EntityType.FieldTest) == EntityType.FieldTest &&
                    widget.FieldTestListUsingForeignKeyFieldNullablePopulated)
                {
                    foreach (FieldTest childFieldTest in widget.FieldTestListUsingForeignKeyFieldNullable)
                    {
                        childFieldTest.ForeignKeyFieldNullable = widget.Identity;
                        if (!entitiesBeingHandled.ContainsEntity(childFieldTest))
                        {
                            if (childFieldTest.IsDeleted)
                            {
                                FieldTestRepo.Delete(entitiesNowBeingHandled, toSave, childFieldTest);
                            }
                            else
                            {
                                FieldTestRepo.Save(entitiesNowBeingHandled, toSave, childFieldTest);
                            }
                        }
                    }
                }

                // Post save protocol
                if (saved)
                {
                    // Allow derived/partial class to do extra work
                    OnAfterSaveEntity(widget);

                    widget.Reset();

                    //The insert/update will have resulted in a new database_update row, inform interested parties
                    RaiseModelChanged();
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Delete Widget entities from the store, including sub entites marked for deletion
        /// </summary>
        /// <param name="entitiesBeingHandled">Entities already being deleted further up the delete stack</param>
        /// <param name="widgets">The Widgets to delete</param>
        /// <param name="toDelete">Entity types to cascade to, if they are loaded</param>
        internal void Delete(List <Entity> entitiesBeingHandled, Flags toDelete, IEnumerable <Widget> widgets)
        {
            if (widgets == null)
            {
                throw new ArgumentNullException("widgets");
            }
            Log("Delete", widgets.Select <Widget, int>(entity => entity.Identity).ToArray <int>(), EntityType.None);

            // Copy the list of entities being handled, and add this new set of entities to it.
            // We're handling those now.
            List <Entity> entitiesNowBeingHandled = new List <Entity>(entitiesBeingHandled);

            entitiesNowBeingHandled.AddRange(widgets);

            // Loop over each entity and delete it.
            foreach (Widget widget in widgets)
            {
                // Already being deleted higher up the stack?
                if (entitiesBeingHandled.ContainsEntity(widget))
                {
                    continue;
                }

                //Allow partial/subclasses to perform additional processing
                OnBeforeDeleteEntity(widget);

                // Delete child entities
                if ((toDelete & EntityType.FieldTest) == EntityType.FieldTest &&
                    widget.FieldTestListUsingForeignKeyFieldPopulated)
                {
                    foreach (FieldTest childFieldTest in widget.FieldTestListUsingForeignKeyField)
                    {
                        if (!entitiesBeingHandled.ContainsEntity(childFieldTest))
                        {
                            FieldTestRepo.Delete(entitiesNowBeingHandled, toDelete, childFieldTest);
                        }
                    }
                }

                // Delete child entities
                if ((toDelete & EntityType.FieldTest) == EntityType.FieldTest &&
                    widget.FieldTestListUsingForeignKeyFieldNullablePopulated)
                {
                    foreach (FieldTest childFieldTest in widget.FieldTestListUsingForeignKeyFieldNullable)
                    {
                        if (!entitiesBeingHandled.ContainsEntity(childFieldTest))
                        {
                            FieldTestRepo.Delete(entitiesNowBeingHandled, toDelete, childFieldTest);
                        }
                    }
                }

                // Now delete the entity
                if (this.Mapper.Delete("DeleteWidget", widget.Identity) != 1)
                {
                    ThrowWidgetEntityException(widget.Identity);
                }
                widget.ResetChanged();
                //Allow partial/subclasses to perform additional processing
                OnAfterDeleteEntity(widget);
            }

            //Save to the repository updates table
            if (widgets.Count() > 0)
            {
                RaiseModelChanged();
            }
        }