¿Cómo utilizar transacciones con Entity Framework? C# .Net

Las transacciones son útiles cuando hablamos de base de datos y debemos hacer muchas consultas en conjunto, ya que nos permiten realizar un retroceso en la manipulación de datos si una de las consultas del conjunto falla.

Con Entity Framework es posible realizar transacciones, y no solo eso, sino que podemos tener el poder de realizar otras funciones distintas a manipulación de datos y decidir si fallan estas otras funciones aplicar un rollback.

A continuación te mostrare con un pequeño ejemplo.

Teniendo nuestro Entity Framework con el nombre MiEntity:


//creamos nuestro contexto
 using (var db = new MiEntity())
{
                //creamos el ámbito de la transacción
                using (var dbContextTransaction = db.Database.BeginTransaction())
                {
                    try
                    {
                        //una consulta
                        tabla oTabla = new tabla();
                        oTabla.campo="pato";

			//agregamos el elemento
                        db.tabla.Add(oTabla);

			//otra consulta
                        tabla2 oTabla2 = new tabla2();
                        oTabla2.campo="pato";

			//agregamos otro elemento
                        db.tabla2.Add(oTabla2);

			//guardamos en la base de datos
                        db.SaveChanges();

                        //hacemos algo extra a manipulación de datos
			//como enviar un mail, suponiendo que regresa true si es exitoso
                        if (!EnviaUnMail())
                        {
                            //hacemos rollback si fallo el envio del mail
                            dbContextTransaction.Rollback();
                        }

                        //Hacemos commit de todos los datos
                        dbContextTransaction.Commit();

                    }
                    catch (Exception ex)
                    {
                        //hacemos rollback si hay excepción
                        dbContextTransaction.Rollback();

                    }
                }
} 

¿Cómo llenar los valores de un combobox con Entity framework en Windows Form .Net? C#

Para llenar de elementos un combobox existe diversas formas de hacerlo, y esta vez te mostrare como hacerlo a partir de una tabla mapeada en Entity Framework.

En el siguiente ejemplo, ya existiendo un Entity Framework en nuestro proyecto, hacemos la consulta deseada a la tabla con los filtros y ordenamiento deseado, y seleccionamos que campo será mostrado y que campo será el valor, llenamos nuestro combobox llamado cboCatalogo:


 using (MiEntity db = new MiEntity()) {

                //realizamos la consulta aplicando filtros y ordenamientos
                //y convertimos a lista, esto ultimo es Importante
                cboCatalogo.DataSource = db.tabla.Where(d => d.algo == 1).OrderBy(d=>d.nombre).ToList();

                //campo que vera el usuario
                cboCatalogo.DisplayMember = "nombre"; 

                //campo que es el valor real
                cboCatalogo.ValueMember = "id";
 }

De esta manera tenemos más control con lo que deseamos mostrar, teniendo el poder de filtrar u ordenar nuestra consulta.

¿Cómo hacer que todas las cadenas en todos los ViewModel en un proyecto en MVC .Net se les aplique Trim o ToUpper? DefaultModelBinder

Cuando se trabaja en un equipo de desarrollo que sobre pasa los 3 programadores muchas veces se debe obligar a que se realicen tareas básicas como recortar los espacios en las cadenas por medio de Trim, o quizá si existe un requerimiento del cliente de que todas las cadenas estén en mayúsculas realizar un ToUpper o por lo contrario un ToLower, bueno, cualquier función sobre algún tipo de dato en todos nuestros modelos de nuestra aplicación.

Para asegurarnos de que siempre sean ejecutadas este tipo de operaciones existe en MVC .Net algo llamado Binder o ModelBinder el cual trabaja como cubierta de la información y puede transformarla a lo que deseemos, validar o realizar una operación.

A continuación incluyo una clase la cual hará que todas las cadenas que existan en nuestros View Model se les aplique una función Trim y una función ToUpper, así evitamos ponerlas en todos los controles, haciendo que esto ya sea un proceso por defecto en toda la aplicación.


namespace Sistema.Models.Binders
{
    public class TrimToUpperBinder : DefaultModelBinder
    {

        protected override void SetProperty(ControllerContext controllerContext,
         ModelBindingContext bindingContext,
         System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
        {
             //Solo modificaremos los string, por lo cual detectamos el tipo de dato
            if (propertyDescriptor.PropertyType == typeof(string))
            {
                var stringValue = (string)value;
                if (!string.IsNullOrEmpty(stringValue))
                {
                    stringValue = stringValue.Trim(); //trimeamos
                    stringValue = stringValue.ToUpper(); //mayuscula
                }

                value = stringValue;
            }

            base.SetProperty(controllerContext, bindingContext,
                                propertyDescriptor, value);
        }
    }
}

Y para que sea ejecutado en toda la aplicación debemos inicializar nuestra clase en el archivo Global.asax en el método Application_Start() de la siguiente manera:


 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //Aquí remplazamos el binder por defecto con el nuestro
            ModelBinders.Binders.DefaultBinder = new Sistema.Models.Binders.TrimToUpperBinder();
        }

¿Cómo convertir archivos XSD a clases de C# .Net? cfdi 3.3 SAT

En este video describo como se puede generar las clases a partir de un archivo XSD.

También explico cómo convertir las clases en archivos XSD que tienen dependencia de otros archivos XSD.

Para ello aprovecho para generar las clases necesarias para crear el archivo XML que sirve para la facturación electrónica 3.3 del SAT en México.

Utilizaremos Visual Studio Command Prompt.

Si desean que haga un curso completo para la facturación electrónica, dime en los comentarios.

¿Cómo verificar automáticamente si existe la sesión web en un desarrollo web? C# .Net

En este video describo cómo es posible estar verificando si el usuario sigue teniendo la sesión en un sistema web.

Muchas veces nuestra sesión ha terminado por inactividad, y esta logística te servirá para tomar una decisión, si mandar al usuario a la pantalla de autentificación o simplemente mostrarle un mensaje de que su sesión expiro.

Ahora ya podrás ser capaz de detectar si la sesión ha terminado sin necesidad de que el usuario se entere hasta que de clic en algún elemento de tu pagina.

Descargar ejemplo

¿Cómo convertir archivo PDF a Docx en C# .Net? – Spire.Pdf vs SautinSoft.PdfFocus

Te muestro como convertir un archivo PDF a un archivo Docx con dos librerías que tienen precio pero hacen su trabajo.

Código del ejemplo:


  class Program
    {
        //ORIGEN PDF
        static string pathPDF = @"C:\AlgunaRuta\archivo.pdf";

        //DESTINOS ARCHIVO DOCX
        static string pathDoc1 = @"C:\AlgunaRuta\archivo-spire.docx";
        static string pathDoc2 = @"C:\AlgunaRuta\archivo-sautin.docx";

        static void Main(string[] args)
        {
            //llamamos para convertir el pdf con spire
            UsandoSpirePdf();

            //llamamos para convertir el pdf con sautinsoft
            UsandoSautin();

        }

        public static void UsandoSpirePdf()
        {

            PdfDocument pdf = new PdfDocument();
            //cargamos el pdf
            pdf.LoadFromFile(pathPDF);

            //guardamos el docx
            pdf.SaveToFile(pathDoc1, FileFormat.DOCX);

            //abrimos el archivo
            System.Diagnostics.Process.Start(pathDoc1);

        }

        public static void UsandoSautin()
        {

            SautinSoft.PdfFocus oPdfFocus = new SautinSoft.PdfFocus();

            //cargamos el pdf
            oPdfFocus.OpenPdf(pathPDF);

            //si se tiene mas de 1 pagina
            if (oPdfFocus.PageCount > 0)
            {
                //asignamos el tipo de documento al que convertiremos
                oPdfFocus.WordOptions.Format = SautinSoft.PdfFocus.CWordOptions.eWordDocument.Docx;

                //guardamos el dox
                int resultado = oPdfFocus.ToWord(pathDoc2);

                if (resultado == 0)
                {
                    //abrimos el documento
                    System.Diagnostics.Process.Start(pathDoc2);
                }
            }
        }
    }

Spire.Pdf: https://www.e-iceblue.com/Introduce/pdf-for-net-introduce.html

SautinSoft.PdfFocus: http://www.sautinsoft.com/products/pdf-focus/

¿Cómo enviar un objeto json en una solicitud Get o Post en C# .Net?

Ahora que estamos en la era de los webservice todos tenemos la necesidad de saber la forma de enviar datos por medio de Get o Post. En C# la forma de hacer una solicitud a un servicio o a un api es muy sencilla y en el siguiente ejemplo te muestro como hacerlo por medio de una clase que yo hice.

La clase siguiente está preparada para enviar cualquier tipo de objeto ya que recibe el tipo de objeto que se enviara y lo serializa en json.

Recuerda que si el objeto tiene referencias circulares, la siguiente clase no funcionara.

Clase:


public class RequestHdeleon

  //esta clase nos sirve para tener control del resultado regresado por la solicitud
  public class Reply
    {
        public Reply()
        {
            this.success = 0;
            message = "";
        }

        public int success { get; set; }
        public object data { get; set; }
        public String menssage { get; set; }

    }

  public Reply Send<T>(string url,T objectRequest, string method="POST"){

            try {
		Reply oReply= new Reply();                

                JavaScriptSerializer js = new JavaScriptSerializer();

		//serializamos el objeto
                string json = Newtonsoft.Json.JsonConvert.SerializeObject(objectRequest);

                //peticion
                WebRequest request = WebRequest.Create(url_callback);
                //headers
                request.Method = method;
                request.PreAuthenticate = true;
                request.ContentType = "application/json;charset=utf-8'";
                request.Timeout = 10000; //esto es opcional

                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(json);
                    streamWriter.Flush();
                }

                var httpResponse = (HttpWebResponse)request.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    result = streamReader.ReadToEnd();
                }
                oReply.success = 1;
                //y aquí va nuestra respuesta, la cual es lo que nos regrese el sitio solicitado
                oReply.data = result;
            }catch(Exception e){

                oReply.result = 0;
		//en caso de error lo manejamos en el mensaje
                oReply.menssage = e.Message;

            }

            return oReply;
        }
}

Ejemplo de como utilizarla:


public class UnaClase(){
   public string algo{get;set;}
}

//creamos la clase para enviar los parametros
UnaClase oUnObjeto= new UnaClase();
oUnObjeto.algo="pato feliz";

//Creamos el objeto para solicitud
RequestHdeleon oRequest= new RequestHdeleon();

//primer parametro url
//segundo parametro el objeto
//tercer parametro el metodo: POST, GET, PUT, DELETE
RequestHdeleon.Reply oReply=oRequest.Send<UnaClase>("http://somesite.com/api/somecontroller/",oUnObjeto,"POST");

¿Cómo enviar un valor en ViewBag por RedirectToAction en C# MVC .Net?

Algunas veces tenemos la necesidad de llamar un método por medio de otro, y para ello hacemos uso de RedirectToAction.

RedirectToAction nos sirve para redirigir al usuario a otro controlador o a otro método dependiendo de la lógica de negocio, pero aparte, a veces necesitamos recibir en nuestro elemento destino algún valor para mostrarle al usuario o para realizar alguna validación. Para ello lo primero que se nos viene a la mente es por medio de ViewBag.

Lamentablemente ViewBag no tiene un tiempo de vida más allá del dominio del método, pero podemos apoyarnos de otro diccionario llamado TempData el cual se mantiene en toda la vida de la solicitud HTTP.

A continuación muestro un ejemplo sencillo de cómo quedaría:


public ActionResult Accion1 {
 TempData["mensaje"] = "Un mensaje feliz :)";

 //redirigimos a la Accion2 del mismo controlador
 return RedirectToAction("Action2");

}

public ActionResult Accion2 {

  if(TempData["mensaje"])
     ViewBag.mensaje = TempData["mensaje"].ToString();

  //de esta manera nuestra vista recibiria el ViewBag.mensaje solo cuando TempData no sea null
  return View();
}

¿Cómo obtener una cadena (string) a partir del contenido de un archivo en C# .Net?

En c# es muy fácil obtener una cadena del contenido de un archivo, esto es algo muy útil ya que podemos almacenar información en texto plano en archivos y esta misma obtenerla en cadenas para darle alguna funcionalidad. Por ejemplo un archivo que contenga el cuerpo de un e-mail en .html y así leerlo como string, manipularlo y después enviarlo.

Anexo una clase que tiene un método estático el cual regresa un string a partir de la ruta de un archivo:


 public class Archivo
    {

        public static string GetStringOfFile(string pathFile)
        {
            try
            {
                var contenido = File.ReadAllText(pathFile);

                return contenido;
            }
            catch (Exception ex)
            {
                return string.Empty;
            }
        }
    }

Y así se utiliza:


string ContenidoArchivo= Archivo.GetStringOfFile("Carpeta/otraCarpeta/AlgunArchivo.html");

Funciona con cualquier extensión: .html, .txt, .xml etc etc.

¿Cómo obtener todos los parámetros enviados a un controller? C# MVC .Net

Cuando estamos utilizando MVC .Net muchas veces es necesario guardar lo que el usuario está enviando en logs o en la base de datos para poder monitorear errores de usuario final (Ver log sencillo en c# .Net).

De la siguiente forma obtenemos todos los parámetros enviados y ordenados en una variable cadena:


string parametros="";

//recorremos todos los parametros
 foreach (var parameter in Request.Params.AllKeys)
                {
                    parametros += parameter + ": " + Request.Params[parameter]+"\n";
                }

//se ira guardando de la siguiente forma
//parametro1: pato
//parametro2: pato2