Referencias anulables en C# 8.0 y posteriores (IV): el operador ! y las propiedades anulables

“Will you decide what makes you an entity
That’s your identity”
Black Sabbath, “End of the Beginning” (2013)

Después de una pausa que se ha extendido más de lo esperado, dedico hoy un último post al operador ! (null-forgiving operator), sobre el que ya hablamos aquí y aquí. Esta vez quiero presentar otro escenario en el que este operador es de utilidad, con el que me topé recientemente experimentando con Entity Framework para un nuevo pequeño proyecto. El ejemplo que se presenta aquí se basa en un proyecto de aplicación de consola para .NET 5.0 (puesto que necesitamos C# 8 para las referencias anulables), que utiliza el paquete Entity Framework Core 5.0.6 para acceder a un clone de una base de datos a la que tengo mucho cariño: la base de datos FUTBOL2006 que se utiliza en mi libro «C# 3.0 y LINQ».

Las herramientas de Entity Framework Core 5 saben cómo interpretar las referencias anulables que el programador incluya en las definiciones code-first de las entidades:

01  public class Futbolista
02  {
03      public int Id { get; set; }
04      public string Nombre { get; set; } // NOT NULL en el SQL generado
05      public DateTime? FechaNacimiento { get; set; }
06      public string? LugarNacimiento { get; set; } // NULL en el SQL generado
07      public char Posicion { get; set; }
08      public virtual Club Club { get; set; } // propiedad de navegación del modelo
09  }

Al compilar el proyecto, para esta clase se obtienen dos advertencias en las líneas 04 (que corresponde a una propiedad física de la tabla) y 08 (que corresponde a una propiedad de navegación):

CS8618: Non-nullable property must contain a non-null value when exiting constructor.
        Consider declaring the property as nullable.

Por supuesto, la sugerencia de declarar las propiedades como anulables iría en contra de lo que intentamos expresar en primer lugar. En esta página de Microsoft se hace un análisis del problema y se ofrecen posibles alternativas. Una de esas alternativas es precisamente inicializar esas propiedades a null (un valor que nunca se observaría en la vida real) y utilizar el operador ! para acallar al compilador:

04      public string Nombre { get; set; } = null!;

Para terminar, presento a continuación un pequeño programa basado en el modelo anterior que lista los futbolistas que jugaron en la temporada 2006 en el Atlético de Madrid:

static void Main(string[] args)
{
    using var context = new Futbol2006Context();

    // Mostrar futbolistas del Atleti
    var colchoneros2006 = context.Futbolistas.
        Where(f => f.Club.Codigo == "ATM").
        OrderBy(f => f.Posicion).
        ThenBy(f => f.Nombre);

    foreach (var f in colchoneros2006)
    {
        Console.WriteLine("{0} ({1})", f.Nombre, f.Posicion);
    }
}

Ésta es la salida que produce el programa. ¡Cuánto tiempo ha pasado!

ANTONIO LOPEZ (D)
FABIANO ELLER (D)
PABLO (D)
PEREA (D)
PERNIA (D)
SEITARIDIS (D)
ZE CASTRO (D)
AGÜERO (L)
MAXI (L)
MISTA (L)
PETROV (L)
TORRES (L)
COSTINHA (M)
DE LAS CUEVAS (M)
GABI (M)
GALLETTI (M)
JURADO (M)
LUCCIN (M)
MANICHE (M)
VALERA (M)
IVAN CUELLAR (P)
LEO FRANCO (P)

Referencia musical: Black Sabbath ocupa sin lugar a dudas un lugar destacado entre los pioneros del rock y el heavy metal. Aunque luego dejé de oírlos y me decanté por una línea más melódica y espiritual del rock, de adolescente sus discos «Black Sabbath» y «Paranoid» (ambos de un lejano 1970) me impresionaron bastante. El tema «End of the Beginning» (Is this the end of the beginning, or the beginning of the end?) pertenece al último disco de estudio que sacaron, «13» (2013), con el que tal vez paradójicamente llegaron al tope de las listas de éxitos por primera vez.

Libros recomendados

«So you run and you run to catch up with the sun but it’s sinking
Racing around to come up behind you again…»
Pink Floyd, «Time», from «The Dark Side of the Moon» (1973)

De manera similar a lo que sugiere el tema inmortal de Pink Floyd, esto de estar al día en todas las tecnologías que nos interesan se convierte cada vez más en misión imposible: cuando crees que ya «controlas» la versión N de la tecnología X, aparece su versión N+1.

Durante los últimos fines de semana, he estado intentando ponerme al día en algunas de las tecnologías que no utilizo de momento en el día a día y que han progresado bastante desde la última vez que «tropecé» seriamente con ellas; concretamente, me refiero a Silverlight y Entity Framework. Para ello, me he apoyado en dos excelentes recursos en castellano, escritos por grandes amigos y aún mejores profesionales, que se me antojan ideales no solo para los desarrolladores .NET castellanohablantes que quieran ponerse al día en las más recientes novedades incorporadas a las respectivas tecnologías, sino también para aquellos que se aproximen por primera vez a ellas y necesiten una fuente que los lleve de la mano, prácticamente desde cero y de una manera concisa, pero completa, a través de los múltiples tópicos que son simplemente imprescindibles para poder aplicarlas con éxito. Me estoy refiriendo a:

  • «Programación en Silverlight 4.0«, de Marino Posadas (Netalia, ISBN 978-84-93489535). Una obra que, a pesar de su título, versa no solo sobre los temas más directamente relacionados con la programación en sí, sino también sobre los que tienen que ver con el diseño de interfaces de usuario; el capítulo dedicado a Expression Blend 4 es un buen ejemplo de ello. Esta edición no solo «toca» las nuevas características que se incorporaron por primera vez en la versión 4 de Silverlight (en particular, todo lo relacionado con la ejecución fuera del navegador), sino que además incluye un capítulo que describe los fundamentos del desarrollo de aplicaciones Silverlight para Windows Phone 7.
  • «ADO.NET Entity Framework 4.0. Aplicaciones y servicios centrado en datos«, de Unai Zorrilla et al (Krasis Press, ISBN 978-84-93669676). Aunque, por razones obvias (le tengo mucho cariño a este libro, cuya primera versión ayudé a «traer al mundo»), puede que mi opinión no sea 100% imparcial, creo sinceramente que la presente edición mejora sensiblemente la original, complementando muchos de los temas originales, poniendo en su lugar a algunos de ellos que por aquel entonces se antojaban más relevantes, e incorporando excelentes presentaciones de prácticamente todas las nuevas características aparecidas con la versión 4.0. Otro gran «plus» de esta nueva edición es su mayor orientación práctica, con mejores ejemplos y un nuevo capítulo, «EF 4.0 en el mundo real», dedicado a presentar las líneas generales del desarrollo de aplicaciones corporativas en múltiples capas basadas en EF 4.0 a través de un ejemplo disponible en Codeplex.

En resumen, dos excelentes obras, que recomiendo de corazón desde aquí a los lectores.

NOTA: Las opiniones reflejadas en este artículo son mías propias, y no han sido revisadas ni aprobadas por la empresa en la que trabajo.


Referencia musical: Para mí, el lugar que ocupa “The Dark Side of the Moon” (1973) en el mapa de la cultura popular occidental contemporánea lo define una estadística: 741 (me apasionan las estadísticas; tal vez por eso sea que me aferro desesperadamente al béisbol, en estos tiempos en que arrasan el soccer y el fútbol americano). 741 es el número de semanas consecutivas que estuvo «La cara oculta» en la lista Billboard de los 200 álbumes más vendidos (entre 1973 y 1988). Fueron más de 14 años, casi el doble de lo que hayan logrado alcanzar sus más cercanos perseguidores. Y ello, a pesar de no tratarse de un producto fabricado para el consumo fácil, estrictamente hablando. Un disco simplemente imprescindible, al igual que la mayoría de los demás trabajos de la banda, como «Wish You Were Here» (1975) o «The Wall» (1979).

Mención al libro en MVP Blog y disquisiciones al respecto

«In these days / When darkness falls early
And people rush home / To the ones they love
You better take a fool’s advice / And take care of your own
‘Cause one day they’re here / Next day they’re gone.»
(«New York Minute», The Eagles, 1994)

Hace unos días, como ya comentaba Unai aquí, se publicó una mención a nuestro libro sobre Entity Framework en el MVP Award Blog. Pequeños reconocimientos como éste tienen para mí un gran valor, pues me sirven para compensar los recuerdos relacionados con la clase de tarea que es escribir un libro: la más dura que me haya tocado nunca, sin duda alguna (y creedme que no toda la vida he estado dando cursos o sentado detrás de un ordenador). Esa tarea se hace más difícil aún cuando el libro trata sobre una tecnología novedosa; baste decir que los dos libros más esperados sobre el tema (el de David Sceppa y el de Julie Lerman) ya van con retraso con respecto a las fechas planificadas. Cierto es que nosotros éramos tres autores, pero aún no había documentación técnica y hubo que obtener mucha información mediante «buceo tecnológico», como bien lo denominó David Salgado. El libro, por supuesto, está muy lejos de ser perfecto; pero lo que puedo garantizar es que nos dejamos la piel en el intento. Y además, en tiempo extra, robado a nuestras familias, que es a lo que hace referencia la cita musical de hoy.


Pop/rock tip: «New York Minute» es una bellísima canción que fue compuesta por Don Henley en 1989 y que inicialmente apareció en un disco suyo en solitario. Luego los Eagles la utilizaron en su gira y disco de reunificación, «Hell Freezes Over» (1994), que sinceramente recomiendo (la versión acústica y en directo de «Hotel California» es especialmente espectacular). La letra de «New York Minute» trata precisamente sobre cómo los sentimientos quedan muchas veces relegados a un plano secundario en este mundo agitado en que vivimos, y tiene ahora mucha más actualidad que hace 20 años: hoy no hay que vivir en Nueva York para sentir el fenómeno.

Liberada CTP de junio 2007 de ADO.NET Entity Framework

Microsoft ha liberado la CTP de junio de 2007 de ADO.NET Entity Framework, que incluye múltiples novedades posteriores a la Beta 1 de .NET Framework 3.5 (para la que también hay una actualizacion, como ha anunciado Jorgito Serrano). Alguna de las nuevas características son el soporte de restricciones de integridad referencial, soporte para transacciones y serialización en las clases generadas automáticamente, mejoras en el soporte para procedimientos almacenados y la gestión de contextos, vistas SQL nativas y soporte para UNICODE y funciones canónicas en Entity SQL.

La CTP puede descargarse desde aquí.

He traducido para MSDN algunos artículos introductorios sobre Entity Framework, como por ejemplo éste.