martes, 28 de mayo de 2019

Esta capacidad abre posibilidades bastante interesantes,que no eran tan inmediatas (o en algunos casos, ni siquiera posibles de forma directa) en versiones "clásicas" de Entity Framework, o EF Core anterior a 2.1. Gracias a ella podremos, por ejemplo, tener en nuestra entidad una propiedad de tipo enum mapeada a una cadena de caracteres en el almacén de datos, o introducir cualquier lógica de transformación, como podría ser la desencriptación y encriptación de valores, a la hora de leer y persistir información.
lunes, 27 de mayo de 2019
Por si te lo perdiste...
- Parámetros opcionales: úsense con precaución
José María Aguilar - ¿Aplicar [Authorize] a todos los controladores MVC de una carpeta?
José María Aguilar
.NET / .NET Core
- Is it better to "!= 0” or ”== mask” when working with enums (C#, RyuJIT)
Jiří Činčura - WinForms - Single-File Applications With .NET Core 3
DevExpress Blogs - Default implementations coming to interfaces with C# 8
Gunnar Peipman - Como instalar un servicio Net Core en Linux
Jorge Turrado - Profiling .NET Core Memory Traffic using JetBrains dotMemory
Steve Gordon - The Uri composition mystery
João Antunes - HttpClient: How to remove charset from Content-Type header
Gunnar Peipman - Making Sense of .NET 5
Bill Reiss - Moving from Node.js to .NET Core
Jim Wang - Be careful of lazy dependencies
Nigel Sampson - Null No More
Simon Timms - Cross-Platform Selenium with DotNet Core
Andy R. Blank - Lying to the compiler
Jon Skeet - Analysing the Large Object Heap in JetBrains dotMemory
Steve Gordon
martes, 21 de mayo de 2019

using
, utilizada tanto en forma de directiva como de instrucción, es una de las más sobrecargadas del lenguaje C#. Es útil para bastantes cosas, como la importación de espacios de nombres, definición de alias de namespaces o tipos, simplificar el acceso a miembros de tipos estáticos, o para especificar bloques o ámbitos de uso de recursos (objetos IDisposable
) que deben ser liberados automáticamente.Centrándonos en este último caso de uso, seguro que en muchas ocasiones habéis escrito código como el siguiente, donde vamos anidando objetos
IDisposable
para asegurar que al finalizar la ejecución de cada bloque los recursos sean liberados de forma automática:void DoSomething()
{
using(var conn = new SqlConnection(...))
{
connection.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "...";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// ...
}
}
}
}
}
Al final, lo que encontramos es código con un nivel de indentación muy alto, y que resulta muy extenso, básicamente porque una gran parte de las líneas las dedicamos sólo a abrir y cerrar llaves. A la postre, esto sólo hace que nuestro código crezca a lo ancho, lo cual no es bueno desde el punto de vista de la simplicidad y facilidad de lectura.
lunes, 20 de mayo de 2019
Por si te lo perdiste...
- Consejos imprescindibles por si algo falla
José María Aguilar - BenchmarkDotNet: Arañando microsegundos en proyectos .NET Core o .NET Framework
José María Aguilar
.NET / .NET Core
- .NET Developer Updates from Build 2019
Sam Basu - Performance Improvements in .NET Core 3.0
Stephen Toub - .NET Core May 2019 Updates - 1.0.16, 1.1.14, 2.1.11 and 2.2.5
Lee Coward - Switch Expressions and Pattern-Based Usings – A Look at New Language Features in C# 8
Matthias Koch - Top 3 Features in C# 8 that will change the way you write code
Chris Pietschmann - .NET Core Global Tools - (What are Global Tools, How to Create and Use them)
Damir Arh - Default implementations in interfaces
Mads Torgersen - Cache Implementations in C# .NET
Michael Shpilt - C# : 6 Cool Language Features That You Rarely Use
Siddharth Patel - Modernize Your C# Code
Florian Rappl - Introducing the Try .NET Global Tool - interactive in-browser documentation and workshop creator
Scott Hanselman - Create Interactive .NET Documentation with Try .NET
Maria Naggaga - Creating Strings with No Allocation Overhead Using String.Create
Steve Gordon
martes, 14 de mayo de 2019

En versiones anteriores a EF Core 2.1 y todos sus antecesores "clásicos", un problema que era difícilmente salvable era la necesidad de que en las entidades existiera un constructor público sin parámetros.
Esto tenía sentido, pues debíamos proporcionar al framework una vía para crear las instancias al materializarlas desde el almacén de datos. De hecho, al materializar, el marco de trabajo usaba dicho constructor para crear la instancia, y luego iba poblando las propiedades una a una utilizando sus setters (o estableciendo el valor de sus backing fields, como vimos en un post anterior)
lunes, 13 de mayo de 2019
Por si te lo perdiste...
- Cómo adaptarse a la RGPD con ASP.NET Core
José María Aguilar - ¿Esa enumeración está vacía?
José María Aguilar
.NET / .NET Core
- .NET Core is the Future of .NET
Scott Hunter - Introducing .NET 5
Richard Lander - Announcing .NET Core 3.0 Preview 5
Richard Lander - Declarative Coding Approach to Caching in .NET Core with PostSharp
Tugberk Ugurlu - Announcing .NET Core 3.0 Preview 5
Richard Lander - Introducing diagnostics improvements in .NET Core 3.0
Sourabh Shirhatti - Your .NET 5 Questions Answered (Kinda Sorta), Part 1: WCF
David Ramel - NLog: Rules and filters
Ivan Yakimov - Default timeouts in .Net code. What are they if you do not specify?
Chris F Carroll - Automatically Detect Expiring HTTPS SSL Certificates
Steve Smith - Looking back at Some of the Changes in C# 6
George Stocker - Cómo crear un servicio Net Core multiplataforma
Jorge Turrado
ASP.NET / ASP.NET Core
- ASP.NET Core updates in .NET Core 3.0 Preview 5
Brady Gaster - Simple custom authentication with ASP.NET Core
Gunnar Peipman - The backend for frontend and the HttpClient
João Antunes - Consuming a GraphQL API with ASP.NET Core
Marinko Spasojevic - Safely migrating passwords in ASP.NET Core Identity with a custom PasswordHasher
Andrew Lock - Simple Authentication In Razor Pages Without A Database
Mike Brind - Comparing Native Blazor Components
Ed Charbeneau - ASP.NET Core Blazor game development using .Net core 3.0 preview,Web API and Visual Studio 2019
Syed Shanu - Handling Access Tokens for private APIs in ASP.NET Core
Damien Bowden - Assembly version tag helper for ASP.NET Core
Gunnar Peipman
miércoles, 8 de mayo de 2019

Y hasta aquí la píldora cultural del día, ahora vamos a lo importante :D
Publicado por José M. Aguilar a las 8:15 a. m.
Etiquetas: aniversario, autobombo, sponsored, variablenotfound
martes, 7 de mayo de 2019

Ya llevamos varios posts dedicados a comentar algunas características novedosas o que cambian bastante respecto a las versiones anteriores (como la evaluación en cliente o las shadow properties, y vamos a continuar en esta línea presentando ahora otra interesante novedad: el soporte para campos de respaldo o backing fields.
lunes, 6 de mayo de 2019
Por si te lo perdiste...
- Problem Details: una forma estándar de retornar errores desde APIs HTTP (y cómo usarlo desde ASP.NET Core)
José María Aguilar - ¿ActionLink te genera direcciones que acaban en Length=N?
José María Aguilar
.NET / .NET Core
- MediatR 7.0.0 Released
Jimmy Bogard - Cómo crear operadores personalizados para clases propias en C#
Jorge Turrado - Serializing objects to URL encoded form data
Gunnar Peipman - Compare .NET Thread Class, Threadpool Class, BackgroundWorker Class and Task Parallel Library
Artemakis Artemiou - Lessons Learnt: Migrating From Net Framework to Net Core
Michael James - .NET Regex: \d is different from [0-9]
Gérald Barré - Performance Showdown of Producer/Consumer (Job Queues) Implementations in C# .NET
Michael Shpilt - .NET Core 3.0 SDK Projects: Controlling Output Folders and Content
Rick Strahl - PDF417 Barcode Decoder .NET Class Library and Two Demo Apps
Uzi Granot - Pattern Matching in C# 8.0
Filip Ekberg - Throwing Standard Exception Types in .NET
Peter Mbanugo - Async-Async: Consequences for parameters to parallel asynchronous calls & Async-Async: Consequences for exceptions
Raymond Chen
lunes, 29 de abril de 2019
Por si te lo perdiste...
- 30 Leyes epónimas relacionadas con el desarrollo de software (I)
José María Aguilar - El filtro [ApiController] en ASP.NET Core MVC 2.1
José María Aguilar
.NET / .NET Core
- Announcing the .NET Framework 4.8
Namrata Karnam - Announcing .NET Core 3 Preview 4
Richard Lander - Upcoming Updates for .NET Framework 4.8
Brett Lopez - Introducing .NET for Apache® Spark™ Preview
Ankit Asthana - AutoMapper 8.1.0 Released
Jimmy Bogard - HTTP Live Streaming (HLS-VOD)
Shashangka Shekhar - Smooth Transactions with TransactionScope
Rion Williams - Commit Your Scripts
K. Scott Allen - Global State in C# Applications - Part 1
Yacoub Massad - Migrating Net Framework to Netcore
Chris F Carroll - Creating a Faster HashSet for .NET
Peter Devo - Implementing Indexers in C#
Peter Mbanugo - 6 Easy Ways to Export Data to Excel in C#
Johnson Manohar - Adventures in .NET Core SDK Installation: Missing SDKs and 32 bit vs 64 bit
Rick Strahl - ASCII Art in .NET Code
Matt Warren - Indices, Ranges, and Null-coalescing Assignments - A Look at New language features in C# 8
Matthias Koch - 7 Debugging Techniques for when your .NET application Freezes (hangs)
Michael Shpilt - First Steps in porting Markdown Monster WPF App to .NET Core 3.0
Rick Strahl - What types should I use to pass collections in C#?
Mark Heath - C# Operators: A Detailed Guide to All Of Them
Phil Vuollet - Writing to CSV-file from multiple threads
Gunnar Peipman - Multi-targetting .Net Framework and .Net Core in a single project
Chris F. Carroll - C# 8: Using statement
Olivier Giss - Explicit Interface Implementation with C#
Christian Nagel - Sharing Context in MediatR Pipelines
Jimmy Bogard - Pulling Objects from Web Services with ReadAsAsync
Peter Vogel - Creating Sample Data for C#
Bruno Sonnino - Using await using (IAsyncDisposable) with ConfigureAwait & Extravaganza using ConfigureAwait, await and await foreach
Jiří Činčura - Diferencias entre conversiones implícitas y explícitas en C# y cómo crear conversiones propias
Jorge Turrado
miércoles, 24 de abril de 2019

Por ejemplo, si instalamos en nuestro equipo la preview del SDK 3.0, a partir de ese momento todos los comandos de la CLI se ejecutarán utilizando esta versión preliminar, como cuando creamos un nuevo proyecto usando
dotnet new
; en este caso, el proyecto se construirá usando la plantilla proporcionada por la versión más actual del framework (aunque sea preview), lo cual puede resultar molesto en algunas ocasiones.En este post vamos a ver cómo el propio SDK dispone de mecanismos que nos permiten seleccionar una versión específica, para lo cual trataremos varios comandos útiles de la CLI.
martes, 23 de abril de 2019

using
... pinta divertido, sin duda :DEn el futuro iremos comentando las características más interesantes, pero, de momento, este post vamos a dedicarlo exclusivamente a ver cómo podemos comenzar a probar C# 8 desde nuestro flamante Visual Studio 2019 u otros entornos, como VS Code o incluso la CLI.
Si aún no habéis tenido el ratillo para instalar la última versión de Visual Studio, ya estáis tardando ;DEl único problema es que necesitamos compiladores que entiendan la sintaxis de C# 8, y de momento esto sólo es posible usando la preview de .NET Core 3. Pero vaya, nada que no podamos solucionar en un par de minutos; veamos cómo.
lunes, 15 de abril de 2019
Por si te lo perdiste...
- Indicios de que tu interfaz de usuario fue creado por un programador
José María Aguilar - ¿Dónde está la directiva @helper de Razor en ASP.NET Core?
José María Aguilar
.NET / .NET Core
- Best 20 dot Net Core Libraries Every Developer should know
Shehryar Khan - C# 8: indexes and ranges
Olivier Giss - string vs. String is not a style debate
Jared Parsons - Why You Should Prefer a Single Line for C# Properties
Thomas Claudius Huber - Using, using, using with C# 8
Christian Nagel - Tuesday Quickie: When closure bites (or how not to configure Newtonsoft.Json)
Joel Hammon - Using strongly-typed entity IDs to avoid primitive obsession Part 1 & Part 2
Andrew Lock
martes, 9 de abril de 2019

Como la asincronía ha llegado para quedarse y aún hay desarrolladores que no lo tienen claro del todo, he pensado que sería interesante traducir y republicar aquí el post, por supuesto, con permiso expreso de su autor (thank you, Mark! ;))
¡Vamos allá!
lunes, 8 de abril de 2019
Por si te lo perdiste...
- Ilities
José María Aguilar - El nuevo tipo de retorno ActionResult<T> en ASP.NET Core 2.1
José María Aguilar
.NET / .NET Core
- Modernize Your C# Code
Florian Rappl - Getting .NET Core 3 Preview to Work in Visual Studio 2019
Jeremy Clark - How to Beat Array Iteration Performance with Parallelism in C# .NET
Michael Shpilt - Making It Up as You Go Along with ExpandoObjects
Peter Vogel - Kirill’s Whitespace Guidelines for C#
Kirill Osenkov - Task.IsCompletedSuccessfully
Jeremy Clark - List vs IEnumerable vs IQueryable vs ICollection vs IDictionary
Mahsa Hassankashi - New C# 8 Features in Visual Studio 2019
Damir Arh - ConcurrentDictionary + closure = 💔
Gérald Barré
martes, 2 de abril de 2019
El problema
En el escenario concreto que planteaba nuestro querido lector era que quería proporcionar, a los componentes que necesitaban acceder a datos en su aplicación, un acceso limitado al contexto de datos de Entity Framework.Para ello, por un lado definía una interfaz parecida a la siguiente, que proporcionaba acceso a los repositorios:
public interface IUserRepositories
{
DbSet<User> Users { get; }
...
}
Por otra parte, definía otra interfaz que era la que permitía comprometer cambios (adiciones, supresiones, modificaciones) realizadas en el contexto de datos:public interface IUnitOfWork
{
int SaveChanges();
}
La idea de esta separación es que si un componente necesitaba exclusivamente consultar datos relativos a usuarios, sólo recibiría mediante inyección de dependencias la instancia de IUserRepositories
, mientras que si necesitaba persistir datos, recibiría adicionalmente un objeto IUnitOfWork
, por ejemplo:public class UserServices
{
...
public UserServices(IMapper mapper, IUserRepositories userRepos, IUnitOfWork uow)
{
_mapper = mapper;
_userRepos = userRepos;
_uow = uow;
}
public async Task Update(int id, UserDto user)
{
var user = await _userRepos.Users.FirstOrDefaultAsync(u=>u.Id == id);
if(user == null)
throw new Exception();
_mapper.Map(userDto, user);
await _uof.SaveChangesAsync();
}
}
Bien, pues el problema lo tenía precisamente a la hora de registrar las dependencias de forma apropiada.
lunes, 1 de abril de 2019
Por si te lo perdiste...
- Adivina, adivinanza: ¿por qué no compila este código?
José María Aguilar - Inicializar a null propiedades sin tipo
José María Aguilar
.NET / .NET Core
- Accepting Partial Resources with Newtonsoft.Json
Florian Rappl & Manuel Römer - AutoMapper's Design Philosophy
Jimmy Bogard - Using .NET PInvoke for Linux system functions
Tom Deseyn - Hosting DI Container with .NET Core 3.0
Christian Nagel - C# Multithreaded Resource Access – Locks, Monitors and Mutex
John Demetriou - Migrating Delegate.BeginInvoke Calls for .NET Core
Mike Rousos - .NET Core Workers as Windows Services
Glenn Condron
martes, 26 de marzo de 2019
Blogger invitado

Jorge Turrado
Apasionado de la programación, siempre buscando la manera de mejorar el día a día con el desarrollo de tecnologías .NET. Apasionado de este momento tan cambiante y fabuloso para ser desarrollador C#.Para hacer esto tenemos varios caminos posibles, unos más automatizables que otros, y cuál elegiremos dependerá de nuestras necesidades:
- A través de la interfaz web de Azure
- Desde Visual Studio
- Usando Azure Resource Manager (ARM).
lunes, 25 de marzo de 2019
Por si te lo perdiste...
- 10 Diferencias entre .NET Core y .NET Framework
José María Aguilar - ¿Comprometidos o involucrados?
José María Aguilar
.NET / .NET Core
- Async Streams with C# 8
Christian Nagel - Schedule Background Jobs Using Hangfire in .NET Core
Changhui Xu - Perfect console application in .net Core: Set up dependency injection & Add unit tests
Michał Białecki - Demystifying HttpClient Internals: HttpRequestMessage
Steve Gordon - C# 8: nullable reference types
Oli -
How to Port Desktop Applications to .NET Core 3.0
Olia Gavrysh - String comparisons are harder than it seems
Gérald Barré - Profiling .NET Code with PerfView and visualizing it with speedscope.app
Adam Sitnik - Benchmarking performance of your code between release versions
Shannon Deminick - YAML, ventajas, desventajas y cuándo usarlo & Leyendo documentos YAML en .NET Core
Jorge Serrano - LazyCache 2.0 released
Alastair Crabtree - Stop wasting time during .NET Core builds
Donovan Brown
martes, 19 de marzo de 2019

En concreto, la duda le surgía al combinar las capacidades de data seeding de EF con las propiedades ocultas, y básicamente era:
Dado que las shadow properties no existen en la entidad, ¿cómo podemos establecerlas en el momento del seeding de datos?Bien, aunque no es fácil de descubrir de forma intuitiva, la solución es bastante sencilla. Si nos fijamos en el intellisense del método que utilizamos para el poblado de datos,
HasData()
, podemos observar varias sobrecargas; por ejemplo, en la siguiente captura se puede ver la información mostrada al invocar este método para la entidad Friend
:
lunes, 18 de marzo de 2019
Por si te lo perdiste...
- Stack traces asíncronas legibles, de serie en .NET Core 2.1 (¡y también en otros frameworks!)
José María Aguilar - Y todavía otras 101 citas célebres del mundo de la informática
José María Aguilar
.NET / .NET Core
- La Evolución del lenguaje C#
CampusMVP - C# Job Queue Implementations in Depth - Part 1
Michael Shpilt - Parallel workflow with the .NET Task Parallel Library (TPL) DataFlow (C#)
Riccardo Terrell - C#88: The Original C#
Rico Mariani - A Definitive FizzBuzz Solution Guide in C#
Matthew Jones - Using async/await and Task.WhenAll to improve the overall speed of your C# code
Jeremy Lindsay - Handling the orientation EXIF tag in images using C#
Richard Moss - C# 7.2 – Let’s talk about readonly structs
John Demetriou - Comparing .NET Imaging Processing APIs (GcImaging vs. ImageSharp)
Shilpa Sharma - C# Dictionary & GetHashCode() & Equals()
Dr. Song Li - .NET Core Container Images now Published to Microsoft Container Registry
Richard Lander - Challenging the C# StringBuilder
Michael Shpilt - Cómo medir tiempos en .Net (con precisión)
Jorge Turrado
martes, 12 de marzo de 2019

A grandes rasgos, se trata de la capacidad de este framework para gestionar propiedades de una entidad que existen en el almacén datos pero no en la clase .NET que la representa en el mundo de los objetos.
De forma intuitiva podemos saber que esto ya existía en las versiones clásicas de Entity Framework. Por ejemplo, cuando introducíamos una propiedad de navegación entre dos entidades sin usar una clave foránea de forma explícita, el propio marco de trabajo creaba, por convención, una columna en la base de datos para almacenar dicha referencia, como en el siguiente escenario:
public class Friend
{
public int Id { get; set; }
public string Name { get; set; }
// Se crea una columna CountryId en la base de datos,
public Country Country { get; set; } // pero no existe en la entidad.
}
El valor de dicha columna CountryId
no podía ser manipulada de forma directa porque se trataba de información usada internamente para gestionar las relaciones y su valor era obtenido y actualizado de forma transparente para nosotros.Pues bien, Entity Framework Core aporta la capacidad para gestionar este tipo de campos "ocultos" para servir a nuestros propios intereses. De esta forma, podríamos añadir a una entidad propiedades que no tienen por qué estar visibles en la clase .NET en forma de propiedades; un ejemplo podría ser el clásico "IsDeleted" cuando implementamos borrado lógico, o información de auditoría como los tradicionales "UpdatedAt" o "UpdatedBy".
lunes, 11 de marzo de 2019
Por si te lo perdiste...
- El hombre que inventó el Control-Alt-Suprimir
José María Aguilar - Implementando más fácilmente background tasks en ASP.NET Core 2.1 (bueno, y 2.0)
José María Aguilar
.NET / .NET Core
- Announcing .NET Core 3 Preview 3
Richard Lander - Modernize Your C# Code
Florian Rappl - Copying and Cloning Arrays in C#
Peter Mbanugo - Features To Build Better Applications With .NET Core 3
Atman Rathod - Hardware intrinsic in .NET Core 3.0
Fei Peng - Exploring CQRS within the Brighter .NET open source project
Scott Hanselman - await the async Letdown
K. Scott Allen - Some performance tricks with .NET strings
Gérald Barré - Floating-Point Parsing and Formatting improvements in .NET Core 3.0
Tanner Gooding - A Simple and Fast Object Mapper
Muhammad Rehan Saeed - Debugging .NET Builds with the MSBuild Structured Log Viewer
K. Scott Allen - Converting an Excel Worksheet into a JSON document with C# and .NET Core and ExcelDataReader
Scott Hanselman - Using .NET Core 3.0 Dependency Injection and Service Provider with WPF
Marco Minerva - My Favorite dotnet CLI Global Tools
Travis Illig - Serilog vs NLog - Help you pick using this ultimate comparison
Thomas Ardal - Base64 decoding bug that is present in all version of .NET
Dmitry Yakimenko - Worker Service template in .NET Core 3.0
Gunnar Peipman - C# 8 – Introducing Target-typed new expressions – Developers Anonymous
John Demetriou - How to parse string dates with a two digit year and split on the right century in C#
Scott Hanselman - Demystifying HttpClient Internals
Steve Gordon