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); }
/// <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); }
protected override void SaveChangesCore(SaveWorkState saveWorkState) { throw new NotImplementedException(); }
protected override void SaveChangesCore(SaveWorkState saveWorkState) { Context.SaveChanges(saveWorkState); }
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); }
/// <summary> /// Perform your custom save to wherever you store entity data. /// This implementation does nothing. /// </summary> protected override void SaveChangesCore(SaveWorkState saveWorkState) { }
//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); }
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); }