Пример #1
0
        protected override void SaveChangesCore(SaveWorkState saveWorkState)
        {
            var saveMap         = saveWorkState.SaveMap;
            var deletedEntities = ProcessSaves(saveMap);

            if (deletedEntities.Any())
            {
                ProcessAllDeleted(deletedEntities);
            }
            ProcessAutogeneratedKeys(saveWorkState.EntitiesWithAutoGeneratedKeys);

            int count;

            try {
                if (Context is DbContext)
                {
                    count = ((DbContext)(object)Context).SaveChanges();
                }
                else
                {
                    count = ObjectContext.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
                }
            } catch (DbEntityValidationException e) {
                var entityErrors = new List <EntityError>();
                foreach (var eve in e.EntityValidationErrors)
                {
                    var      entity         = eve.Entry.Entity;
                    var      entityTypeName = entity.GetType().FullName;
                    Object[] keyValues;
                    var      key = ObjectContext.ObjectStateManager.GetObjectStateEntry(entity).EntityKey;
                    if (key.EntityKeyValues != null)
                    {
                        keyValues = key.EntityKeyValues.Select(km => km.Value).ToArray();
                    }
                    else
                    {
                        var entityInfo = saveWorkState.EntitiesWithAutoGeneratedKeys.FirstOrDefault(ei => ei.Entity == entity);
                        if (entityInfo != null)
                        {
                            keyValues = new Object[] { entityInfo.AutoGeneratedKey.TempValue };
                        }
                        else
                        {
                            // how can this happen?
                            keyValues = null;
                        }
                    }
                    foreach (var ve in eve.ValidationErrors)
                    {
                        var entityError = new EntityError()
                        {
                            EntityTypeName = entityTypeName,
                            KeyValues      = keyValues,
                            ErrorMessage   = ve.ErrorMessage,
                            PropertyName   = ve.PropertyName
                        };
                        entityErrors.Add(entityError);
                    }
                }
                saveWorkState.EntityErrors = entityErrors;
            } catch (Exception) {
                throw;
            }

            saveWorkState.KeyMappings = UpdateAutoGeneratedKeys(saveWorkState.EntitiesWithAutoGeneratedKeys);
        }
Пример #2
0
        /// <summary>
        /// Persist the changes to the entities in the saveMap.
        /// This implements the abstract method in ContextProvider.
        /// Assigns saveWorkState.KeyMappings, which map the temporary keys to their real generated keys.
        /// Note that this method sets session.FlushMode = FlushMode.Never, so manual flushes are required.
        /// </summary>
        /// <param name="saveMap">Map of Type -> List of entities of that type</param>
        protected override void SaveChangesCore(SaveWorkState saveWorkState)
        {
            var saveMap = saveWorkState.SaveMap;

            session.FlushMode = FlushMode.Never;
            var tx = session.Transaction;
            var hasExistingTransaction = tx.IsActive;

            if (!hasExistingTransaction)
            {
                tx.Begin(BreezeConfig.Instance.GetTransactionSettings().IsolationLevelAs);
            }
            try {
                // Relate entities in the saveMap to other NH entities, so NH can save the FK values.
                var fixer     = GetRelationshipFixer(saveMap);
                var saveOrder = fixer.FixupRelationships();

                // Allow subclass to process entities before we save them
                saveOrder = BeforeSaveEntityGraph(saveOrder);

                ProcessSaves(saveOrder);

                session.Flush();
                RefreshFromSession(saveMap);
                if (!hasExistingTransaction)
                {
                    tx.Commit();
                }
                fixer.RemoveRelationships();
            }
            catch (PropertyValueException pve)
            {
                // NHibernate can throw this
                if (tx.IsActive)
                {
                    tx.Rollback();
                }
                entityErrors.Add(new EntityError()
                {
                    EntityTypeName = pve.EntityName,
                    ErrorMessage   = pve.Message,
                    ErrorName      = "PropertyValueException",
                    KeyValues      = null,
                    PropertyName   = pve.PropertyName
                });
                saveWorkState.EntityErrors = entityErrors;
            } catch (Exception) {
                if (tx.IsActive)
                {
                    tx.Rollback();
                }
                throw;
            } finally {
                if (!hasExistingTransaction)
                {
                    tx.Dispose();
                }
            }

            saveWorkState.KeyMappings = UpdateAutoGeneratedKeys(saveWorkState.EntitiesWithAutoGeneratedKeys);
        }
Пример #3
0
 protected override void SaveChangesCore(SaveWorkState saveWorkState)
 {
     throw new NotImplementedException();
 }
Пример #4
0
 protected override void SaveChangesCore(SaveWorkState saveWorkState)
 {
     Context.SaveChanges(saveWorkState);
 }
Пример #5
0
 public Dictionary <Type, List <EntityInfo> > GetSaveMapFromSaveBundle(JObject saveBundle)
 {
     InitializeSaveState(saveBundle); // Sets initial EntityInfos
     SaveWorkState.BeforeSave();      // Creates the SaveMap as byproduct of BeforeSave logic
     return(SaveWorkState.SaveMap);
 }
        protected override void SaveChangesCore(SaveWorkState saveWorkState)
        {
            var saveMap         = saveWorkState.SaveMap;
            var deletedEntities = ProcessSaves(saveMap);

            if (deletedEntities.Any())
            {
                ProcessAllDeleted(deletedEntities);
            }
            ProcessAutogeneratedKeys(saveWorkState.EntitiesWithAutoGeneratedKeys);


            try {
                DbContext.SaveChanges();

                //} catch (DbEntityValidationException e) {
                //  var entityErrors = new List<EntityError>();
                //  foreach (var eve in e.EntityValidationErrors) {
                //    var entity = eve.Entry.Entity;
                //    var entityTypeName = entity.GetType().FullName;
                //    Object[] keyValues;
                //    var key = GetEntityEntry(entity).EntityKey;
                //    if (key.EntityKeyValues != null) {
                //      keyValues = key.EntityKeyValues.Select(km => km.Value).ToArray();
                //    } else {
                //      var entityInfo = saveWorkState.EntitiesWithAutoGeneratedKeys.FirstOrDefault(ei => ei.Entity == entity);
                //      if (entityInfo != null) {
                //        keyValues = new Object[] { entityInfo.AutoGeneratedKey.TempValue };
                //      } else {
                //        // how can this happen?
                //        keyValues = null;
                //      }
                //    }
                //    foreach (var ve in eve.ValidationErrors) {
                //      var entityError = new EntityError() {
                //        EntityTypeName = entityTypeName,
                //        KeyValues = keyValues,
                //        ErrorMessage = ve.ErrorMessage,
                //        PropertyName = ve.PropertyName
                //      };
                //      entityErrors.Add(entityError);
                //    }

                //  }
                //  saveWorkState.EntityErrors = entityErrors;
            } catch (DataException e) {
                var nextException = (Exception)e;
                while (nextException.InnerException != null)
                {
                    nextException = nextException.InnerException;
                }
                if (nextException == e)
                {
                    throw;
                }
                else
                {
                    //create a new exception that contains the toplevel exception
                    //but has the innermost exception message propogated to the top.
                    //For EF exceptions, this is often the most 'relevant' message.
                    throw new Exception(nextException.Message, e);
                }
            } catch (Exception) {
                throw;
            }

            saveWorkState.KeyMappings = UpdateAutoGeneratedKeys(saveWorkState.EntitiesWithAutoGeneratedKeys);
        }
Пример #7
0
 /// <summary>
 /// Perform your custom save to wherever you store entity data.
 /// This implementation does nothing.
 /// </summary>
 protected override void SaveChangesCore(SaveWorkState saveWorkState)
 {
 }
Пример #8
0
        //protected override List<KeyMapping> SaveChangesCore(Dictionary<Type, List<EntityInfo>> saveMap)
        //{
        //    return _kernel.Get<ISummerBreezeDbContext>().SaveChanges(saveMap);
        //}

        protected override void SaveChangesCore(SaveWorkState saveWorkState)
        {
            _kernel.Get <ISummerBreezeDbContext>().SaveChanges(saveWorkState);
        }
Пример #9
0
        protected override void SaveChangesCore(SaveWorkState saveWorkState)
        {
            var saveMap         = saveWorkState.SaveMap;
            var deletedEntities = ProcessSaves(saveMap);

            if (deletedEntities.Any())
            {
                ProcessAllDeleted(deletedEntities);
            }
            ProcessAutogeneratedKeys(saveWorkState.EntitiesWithAutoGeneratedKeys);
            ProcessIdentityKeys(saveWorkState.EntitiesWithAutoGeneratedKeys);

            int count;

            try
            {
                count = Context.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                var entityErrors = new List <EntityError>();
                foreach (var entry in e.Entries)
                {
                    var      entity         = entry.Entity;
                    var      entityTypeName = entity.GetType().FullName;
                    Object[] keyValues;
                    var      primaryKey = entry.Metadata.FindPrimaryKey();
                    if (primaryKey != null && entry.IsKeySet)
                    {
                        var keyNames = primaryKey.Properties.Select(k => k.Name).ToList();
                        keyValues = keyNames.Select(keyName => entry.Property(keyName).CurrentValue).ToArray();
                    }
                    else
                    {
                        var entityInfo = saveWorkState.EntitiesWithAutoGeneratedKeys.FirstOrDefault(ei => ei.Entity == entity);
                        if (entityInfo != null)
                        {
                            keyValues = new Object[] { entityInfo.AutoGeneratedKey.TempValue };
                        }
                        else
                        {
                            // how can this happen?
                            keyValues = null;
                        }
                    }

                    // EF Core 1 does not have validation errors
                    //foreach (var ve in eve.ValidationErrors)
                    //{
                    //	var entityError = new EntityError()
                    //	{
                    //		EntityTypeName = entityTypeName,
                    //		KeyValues = keyValues,
                    //		ErrorMessage = ve.ErrorMessage,
                    //		PropertyName = ve.PropertyName
                    //	};
                    //	entityErrors.Add(entityError);
                    //}
                }
                saveWorkState.EntityErrors = entityErrors;
            }
            catch (DataException e)
            {
                var nextException = (Exception)e;
                while (nextException.InnerException != null)
                {
                    nextException = nextException.InnerException;
                }
                if (nextException == e)
                {
                    throw;
                }
                else
                {
                    //create a new exception that contains the toplevel exception
                    //but has the innermost exception message propogated to the top.
                    //For EF exceptions, this is often the most 'relevant' message.
                    throw new Exception(nextException.Message, e);
                }
            }
            catch (Exception e)
            {
                throw;
            }

            saveWorkState.KeyMappings = UpdateAutoGeneratedKeys(saveWorkState.EntitiesWithAutoGeneratedKeys);
        }