예제 #1
0
        public async Task <SaveBaseEntityResponse> SaveEntity(BaseEntity entity)
        {
            SaveBaseEntityResponse response = new SaveBaseEntityResponse();

            BeforeSaveEntity(entity);
            var isValid = ValidateSaveEntity(entity);

            if (isValid)
            {
                var             connectionString = _appSettings.ConnectionString;
                MySqlConnection conn             = null;
                IDbTransaction  trans            = null;
                try
                {
                    conn = new MySqlConnection(connectionString);
                    if (conn != null && conn.State == ConnectionState.Closed)
                    {
                        conn.Open();
                        trans = await conn.BeginTransactionAsync();

                        await DoSaveEntity(entity, response, conn, trans);

                        trans.Commit();
                    }
                }
                catch (Exception)
                {
                    trans.Rollback();
                    throw;
                }
                finally
                {
                    if (conn != null)
                    {
                        if (conn.State != ConnectionState.Closed)
                        {
                            await conn.CloseAsync();
                        }

                        await conn.DisposeAsync();
                    }

                    if (trans != null)
                    {
                        trans.Dispose();
                    }
                }
            }
            AfterSaveEntity(entity, response);

            return(response);
        }
예제 #2
0
        private async Task <bool> DoSaveEntity(BaseEntity entity, SaveBaseEntityResponse response, IDbConnection conn, IDbTransaction trans)
        {
            BeforeSaveEntityWithTransaction(entity, response, conn, trans);
            var saveMasterSuccess = await _repository.SaveEntity(entity, conn, trans);

            AfterSaveEntityWithTransaction(entity, response, conn, trans);

            var hasAtLeastOneDetailFail = false; // có ít nhất 1 detail bị save fail

            if (saveMasterSuccess)
            {
                var details = entity.GetDetails();
                if (details != null && details.Count > 0)
                {
                    var masterId = entity.GetPrimaryKeyValue();
                    foreach (var lstDetailEntity in details)
                    {
                        if (lstDetailEntity != null && lstDetailEntity.Count > 0)
                        {
                            var firstDetailEntity = lstDetailEntity[0];
                            foreach (var detailEntity in lstDetailEntity)
                            {
                                var foreignKeyName = detailEntity.GetForeignKeyName();
                                if (!string.IsNullOrWhiteSpace(foreignKeyName))
                                {
                                    detailEntity.SetValueByPropertyName(foreignKeyName, masterId);
                                    var saveDetailSuccess = await DoSaveEntity(detailEntity, response, conn, trans);

                                    if (!saveDetailSuccess)
                                    {
                                        hasAtLeastOneDetailFail = true;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(saveMasterSuccess && !hasAtLeastOneDetailFail);
        }
예제 #3
0
 private void AfterSaveEntity(BaseEntity entity, SaveBaseEntityResponse response)
 {
 }
예제 #4
0
 private void BeforeSaveEntityWithTransaction(BaseEntity entity, SaveBaseEntityResponse response, IDbConnection conn, IDbTransaction trans)
 {
 }