protected virtual void AntesDePersistirValidarRegistro(TRegistro registro, ParametrosDeNegocio parametros)
        {
            var negocio = NegociosDeSe.NegocioDeUnDtm(registro.GetType().FullName);

            if (!Contexto.DatosDeConexion.CreandoModelo && (!parametros.Parametros.ContainsKey(NegociosDeSe.ValidarSeguridad) || (bool)parametros.Parametros[NegociosDeSe.ValidarSeguridad]))
            {
                ValidarPermisosDePersistencia(parametros.Operacion, negocio, registro);
            }

            if ((parametros.Operacion == enumTipoOperacion.Insertar || parametros.Operacion == enumTipoOperacion.Modificar) && registro.ImplementaNombre())
            {
                var propiedades = registro.PropiedadesDelObjeto();
                foreach (var propiedad in propiedades)
                {
                    if (propiedad.Name == nameof(INombre.Nombre))
                    {
                        if (((string)propiedad.GetValue(registro)).IsNullOrEmpty())
                        {
                            GestorDeErrores.Emitir($"El nombre del objeto {typeof(TRegistro).Name} es obligatorio");
                        }
                        break;
                    }
                }
            }

            if (parametros.Operacion == enumTipoOperacion.Modificar || parametros.Operacion == enumTipoOperacion.Eliminar)
            {
            }
        }
        public enumModoDeAccesoDeDatos LeerModoDeAccesoAlNegocio(int idUsuario, enumNegocio negocio)
        {
            if (Contexto.DatosDeConexion.EsAdministrador)
            {
                return(enumModoDeAccesoDeDatos.Administrador);
            }

            if (NegociosDeSe.EsDeParametrizacion(negocio) && !Contexto.DatosDeConexion.EsAdministrador)
            {
                return(enumModoDeAccesoDeDatos.Consultor);
            }

            if (!NegociosDeSe.UsaSeguridad(negocio) || negocio == enumNegocio.No_Definido)
            {
                return(enumModoDeAccesoDeDatos.Administrador);
            }

            enumModoDeAccesoDeDatos modoDelUsuario = enumModoDeAccesoDeDatos.SinPermiso;

            var cache  = ServicioDeCaches.Obtener($"{nameof(GestorDeElementos)}.{nameof(LeerModoDeAccesoAlNegocio)}");
            var indice = $"Usuario:{idUsuario} Negocio:{negocio.ToNombre()}";

            if (!cache.ContainsKey(indice))
            {
                var modosLeidos = ModosDeAccesoAlNegocio(idUsuario, negocio);
                foreach (var modoLeido in modosLeidos)
                {
                    if (modoLeido.Administrador)
                    {
                        modoDelUsuario = enumModoDeAccesoDeDatos.Administrador;
                        break;
                    }
                    else
                    {
                        if (modoDelUsuario != enumModoDeAccesoDeDatos.Gestor && modoLeido.Gestor)
                        {
                            modoDelUsuario = enumModoDeAccesoDeDatos.Gestor;
                        }
                        else
                        if (modoLeido.Consultor && modoDelUsuario == enumModoDeAccesoDeDatos.SinPermiso)
                        {
                            modoDelUsuario = enumModoDeAccesoDeDatos.Consultor;
                        }
                    }
                }

                if (modoDelUsuario != enumModoDeAccesoDeDatos.SinPermiso && !NegocioActivo(negocio))
                {
                    return(enumModoDeAccesoDeDatos.Consultor);
                }

                cache[indice] = modoDelUsuario;
            }

            return((enumModoDeAccesoDeDatos)cache[indice]);
        }
        public TRegistro PersistirRegistro(TRegistro registro, ParametrosDeNegocio parametros)
        {
            if (parametros.Operacion != enumTipoOperacion.Insertar)
            {
                parametros.registroEnBd = LeerRegistroPorId(registro.Id, false, false, false, aplicarJoin: false);
            }

            var transaccion = Contexto.IniciarTransaccion();

            try
            {
                AntesDePersistir(registro, parametros);

                if (parametros.Operacion == enumTipoOperacion.Insertar)
                {
                    Contexto.Add(registro);
                }
                else
                if (parametros.Operacion == enumTipoOperacion.Modificar)
                {
                    Contexto.Update(registro);
                }
                else
                if (parametros.Operacion == enumTipoOperacion.Eliminar)
                {
                    Contexto.Remove(registro);
                }
                else
                {
                    throw new Exception($"Solo se pueden persistir operaciones del tipo {enumTipoOperacion.Insertar} o  {enumTipoOperacion.Modificar} o {enumTipoOperacion.Eliminar}");
                }

                Contexto.SaveChanges();

                if (Auditoria.ImplementaAuditoria(typeof(TRegistro)))
                {
                    var negocio = NegociosDeSe.NegocioDeUnDtm(typeof(TRegistro).FullName);
                    var auditar = parametros.Operacion == enumTipoOperacion.Modificar ? parametros.registroEnBd : registro;
                    AuditoriaDeElementos.RegistrarAuditoria(Contexto, negocio, parametros.Operacion, (IElementoDtm)auditar);
                }

                DespuesDePersistir(registro, parametros);
                Contexto.Commit(transaccion);
            }
            catch (Exception)
            {
                Contexto.Rollback(transaccion);
                throw;
            }
            return(registro);
        }
        public bool ValidarPermisosDePersistencia(enumTipoOperacion operacion, enumNegocio negocio, TRegistro registro)
        {
            if (Contexto.DatosDeConexion.EsAdministrador || negocio == enumNegocio.No_Definido || !NegociosDeSe.UsaSeguridad(negocio))
            {
                return(true);
            }

            if (!Contexto.DatosDeConexion.EsAdministrador && NegociosDeSe.EsDeParametrizacion(negocio))
            {
                GestorDeErrores.Emitir($"El usuario {Contexto.DatosDeConexion.Login} no tiene permisos de parametrización sobre el negocio {negocio.ToNombre()}");
            }

            var modoAcceso  = LeerModoDeAccesoAlNegocio(Contexto.DatosDeConexion.IdUsuario, negocio);
            var hayPermisos = modoAcceso == enumModoDeAccesoDeDatos.Administrador;

            if (!hayPermisos)
            {
                if (operacion == enumTipoOperacion.Insertar)
                {
                    hayPermisos = modoAcceso == enumModoDeAccesoDeDatos.Gestor;
                }
                else
                {
                    var modoAccesoElemento = LeerModoDeAccesoAlElemento(Contexto.DatosDeConexion.IdUsuario, negocio, registro.Id);
                    hayPermisos = modoAccesoElemento == enumModoDeAccesoDeDatos.Gestor || modoAccesoElemento == enumModoDeAccesoDeDatos.Administrador;
                }
            }

            //var gestorDeNegocio = Gestores<TContexto, NegocioDtm, NegocioDto>.Obtener(Contexto, Mapeador, "Negocio.GestorDeNegocio");
            //var negocioDtm = gestorDeNegocio.LeerRegistroCacheado(nameof(NegocioDtm.Nombre), NegociosDeSe.ToString(negocio));
            //var cache = ServicioDeCaches.Obtener($"{nameof(GestorDeElementos)}.{nameof(ValidarPermisosDePersistencia)}");
            //var indice = $"Usuario:{idUsuario} Permiso:{negocioDtm.IdPermisoDeGestor}";

            //if (!cache.ContainsKey(indice))
            //{
            //    var gestorDePermisosDeUnUsuario = Gestores<TContexto, PermisosDeUnUsuarioDtm, PermisosDeUnUsuarioDto>.Obtener(Contexto, Mapeador, "Entorno.GestorDePermisosDeUnUsuario");
            //    var filtros = new List<ClausulaDeFiltrado>();
            //    filtros.Add(new ClausulaDeFiltrado { Clausula = nameof(PermisosDeUnUsuarioDtm.IdUsuario), Criterio = CriteriosDeFiltrado.igual, Valor = idUsuario.ToString() });
            //    filtros.Add(new ClausulaDeFiltrado { Clausula = nameof(PermisosDeUnUsuarioDtm.IdPermiso), Criterio = CriteriosDeFiltrado.esAlgunoDe, Valor = $"{negocioDtm.IdPermisoDeGestor},{negocioDtm.IdPermisoDeAdministrador}" });

            //    if (gestorDePermisosDeUnUsuario.Contar(filtros) == 0)
            //        GestorDeErrores.Emitir($"El usuario {Contexto.DatosDeConexion.Login} no tiene permisos para {operacion.ToString().ToLower()} los datos de {NegociosDeSe.ToString(negocio)}");

            //    cache[indice] = true;
            //}
            //return (bool)cache[indice];

            return(hayPermisos);
        }