Te mostrare como comenzar de cero a utilizar Entity Framework, además a obtener, crear, editar y eliminar datos, y todo en menos de 10 minutos.
Categoría: Cursos
¿Cómo aplicar un update a varias filas por medio de EntityFramework.Extended? C# .Net
Existen varias formas de modificar varios elementos en conjunto por medio de Entity Framework.
Igual te recuerdo que utilizar EntityFramework.Extended como Entity Framework nativo no las recomiendo cuando vas a modificar más de mil datos, mejor utiliza un procedimiento almacenado.
La ventaja que veo al utilizar EntityFramework.Extended es un aspecto de sintaxis ya que de esta manera evitamos hacer el recorrido de los elementos e ir modificando objeto por objeto, con esta librería es de una forma más sencilla para el programador.
Para el siguiente ejemplo, supongamos que tenemos una tabla llamada Persona, que debemos modificar la edad a 10 años de todas las personas de Nombre “Juan”. Seria de la siguiente manera:
using(MiEntity db= new MiEntity()){ //realizamos la modificación sin foreach, ni SaveChanges() db.Persona.Where(d => d.Nombre=="Juan") .Update(x => new Persona() { Edad = 10 }); }
De esta manera no necesitamos el método SaveChanges(), ya que Update lo hace internamente.
¿Cómo aplicar un update a varias filas por medio de Entity Framework? C# .Net
Existen varias formas de modificar varios elementos en conjunto por medio de Entity Framework.
Te mostrare como realizar una forma de cómo hacerlo a continuación. Teniendo una tabla llamada Persona, supongamos que debemos modificar la edad a 10 años de todas las personas de Nombre “Juan”. Seria de la siguiente manera:
using(MiEntity db= new MiEntity()){ //Obtenemos todos los Juanes IQuearyable<Persona> lst = db.Persona.Where(d=>d.Nombre=='Juan'); //recorremos la lista foreach(Persona oPersona in lst){ //asignamos la edad oPersona.Edad=10; } //modificamos los datos en la base de datos db.SaveChanges(); }
Cuando tengas la necesidad de editar más de mil filas en un proceso, mejor hazlo con un procedimiento almacenado (Stored procedure).
¿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 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/
Borrar el cache al subir una imagen y mostrarla en el navegador en MVC .Net #Razor
Cuando hacemos un módulo para actualizar una imagen, ya sea el logotipo o una galería, muchas veces tenemos el problema de que sigue saliendo en el navegador la imagen vieja hasta que borramos el cache del navegador.
Lamentablemente los usuarios no saben que es el cache y esperan ver su imagen nueva, al seguir viendo la imagen vieja, el usuario piensa que no se ha subido con éxito la nueva imagen.
En el caso de Mvc .Net esto re se resuelve con un truco, e igual puede resolverse con su equivalencia en cualquier otro lenguaje de programación.
Para esto vamos a hacer uso de la funcionalidad Random, funcionalidad que existe en todo lenguaje de programación y basta con hacerlo de la siguiente manera, en el caso de MVC .Net lo haremos en razor (en la vista):
@{ //creamos el objeto random y asignamos a una variable string Random r = new Random(); string a = r.Next().ToString(); } <img src='http://unsitio.com/unaimagen.jpg?a=@a'>
Al poner una variable con un valor nuevo al final de nuestra url de la imagen, obligamos al navegador a volver a cargarla y no utilizar la que tiene en cache.
Un truco viejo, pero que pocos conocen.
¿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 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
Creación de archivo PDF en C# a partir de un archivo HTML (sin crystal report, sin itextsharp)
Creación de un archivo pdf sin utilizar ni crystal report ni itextsharp, de esta manera no dependemos de dll engorrosas como Crystal Reports.
Liga de libreria: https://wkhtmltopdf.org/