martes, 12 de marzo de 2019
Seguimos hablando de características interesantes de Entity Framework Core, y en esta ocasión nos detendremos en las shadow properties, o propiedades ocultas.
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:
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".
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
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
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
martes, 5 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#.Como desarrollador del ecosistema .NET, seguro que alguna vez has usado el gestor de paquetes NuGet (y si aún no lo has hecho, lo acabarás haciendo antes o después, créeme). Esta herramienta permite empaquetar componentes que cumplen una necesidad determinada, ya sea de terceros o internos de nuestra empresa, dejándolos listos para obtenerlos e incluirlos rápidamente en nuestros proyectos sin tener que compilarlos cada vez o almacenarlos en forma de binarios en una enorme carpeta con cientos de librerías.
Su máximo referente es el repositorio público Nuget.org, integrado dentro de Visual Studio y repositorio de facto de .NET Core, aunque también existen repositorios NuGet privados, o incluso puedes crear el tuyo sin ningún problema bajándote el paquete Nuget.Server desde el propio Nuget.org e implementándolo, ¿es poético verdad? 😊).
Ahora que hemos introducido qué es NuGet para quien no lo supiese, tal vez te hayas preguntado cómo es posible crear un paquete NuGet y publicarlo para que otros desarrolladores puedan utilizarlo. Vamos a ver que es algo realmente sencillo.
lunes, 4 de marzo de 2019
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Lambdas como árboles de expresión
José María Aguilar - Usar Razor desde una aplicación de consola .NET Core (2 de 2)
José María Aguilar
.NET / .NET Core
- An update to C# versions and C# tooling
Phillip Carter - DateTime.Now: Usage, Examples, Best Practices, and Pitfalls
Carlos Schults - AKS, KeyVault y netcore
Eduard Tomás - How to Create, Use, and Debug .NET application Crash Dumps in 2019
Michael Shpilt - Creating Custom Web Crawler with Dotnet Core using Entity Framework Core
Mehmet Ozkaya - C# 8.0 in-depth: Setup C# 8.0 and .NET Core 3.0
Dix Yan - An Introduction to Optimising Code Using Span
Steve Gordon - WhiteList Proxying with ASP.Net Core
John Reilly - TransientFaultHandling.Core: Retry library for .NET Core/.NET Standard
Dixin Yan - An example of interaction-based testing in C#
Mark Seemann - Runtime analysis and leak detection for Autofac
Nicholas Blumhardt - C# 8 surprising patterns & Discards and underscores & Tuple deconstruction and positional patterns] & Variable declarations and type patterns
Ian Griffiths - AutoMapper Usage Guidelines
Jimmy Bogard - How to port desktop applications to .NET Core 3.0
Olia Gavrysh - Learning about .NET Core futures by poking around at David Fowler's GitHub
Scott Hanselman - Is C# a low-level language?
Matt Warren
martes, 26 de febrero de 2019
Sin duda, Entity Framework Core es un gran marco de trabajo para implementar el acceso a datos de nuestras aplicaciones, pues es rápido, potente y nos ahorra una gran cantidad de esfuerzo, sobre todo en proyectos muy centrados en datos.
Sin embargo, estas ayudas tienen un coste importante, al igual que ocurre con casi cualquier framework al que vayamos a confiar parte de nuestro sistema, sea del ámbito que sea: hay que conocerlo bien para no dispararse en un pie en cuanto apretemos el gatillo.
Hace muuuuchos, muchos años hablamos de cómo aplicar convenientemente la carga anticipada (eager loading) en Entity Framework podía acelerar de forma drástica el rendimiento en el acceso a datos de nuestras aplicaciones, evitando el temido problema denominado "SELECT N+1". Esto continúa siendo válido para la versión Core de este marco de trabajo: sigue existiendo el extensor
Pues bien, en EF Core hay otro detalle que, si bien utilizándolo con conocimiento puede resultar muy interesante, es fácil que nos tumbe el rendimiento de nuestros accesos a datos si no lo usamos con cuidado: la evaluación en cliente.
Sin embargo, estas ayudas tienen un coste importante, al igual que ocurre con casi cualquier framework al que vayamos a confiar parte de nuestro sistema, sea del ámbito que sea: hay que conocerlo bien para no dispararse en un pie en cuanto apretemos el gatillo.
Hace muuuuchos, muchos años hablamos de cómo aplicar convenientemente la carga anticipada (eager loading) en Entity Framework podía acelerar de forma drástica el rendimiento en el acceso a datos de nuestras aplicaciones, evitando el temido problema denominado "SELECT N+1". Esto continúa siendo válido para la versión Core de este marco de trabajo: sigue existiendo el extensor
Include()
e incluso variantes de éste como ThenInclude()
que permiten incluir en una única consulta las entidades que sabemos que vamos a necesitar.Pues bien, en EF Core hay otro detalle que, si bien utilizándolo con conocimiento puede resultar muy interesante, es fácil que nos tumbe el rendimiento de nuestros accesos a datos si no lo usamos con cuidado: la evaluación en cliente.
lunes, 25 de febrero de 2019
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Expresiones lambda como delegados
José María Aguilar - Capturar la pantalla con Windows 10
José María Aguilar
.NET / .NET Core
- .NET Core 1.0 and 1.1 will reach End of Life on June 27, 2019
Rich Lander - Announcing .NET Framework 4.8 Early Access Build 3745
Namrata Karnam - C# 8 – Introducing Index struct and a brand new usage for the hat operator – Developers Anonymous
John Demetriou - Dynamically compile and run code using .NET Core 3.0
Laurent Kempé - Novedades de C# 8
Fernando Escolar - Novedades de C# 8.0 al escenario
David Gonzalo - Universal hierarchy traversing in C#
Gunnar Peipman - Switching Between .NET Core SDK Versions
Faisal Pathan - Introduction to Benchmarking C# Code with Benchmark .NET
Steve Gordon - .NET Internals Cookbook Part 1 — Exceptions, filters and corrupted processes
Adam Furmanek - C# 8: Default Interface Methods Implementation
Dawid Sibiński - How to exclude code from code coverage
Gunnar Peipman - Heap vs stack, value type vs reference type
Konrad Kokosa - HttpClient Creation and Disposal Internals: Should I Dispose of HttpClient?
Steve Gordon - What's the Difference Between Razor and Blazor?!?
Jason Robert - Dependency Injection for Quartz.NET in .NET Core
Bohdan Stupak - Exploring .NET Core 3.0 new API
Patrick Smacchia