Novedades de EF Core 10
EF Core 10 (EF10) es la próxima versión después de EF Core 9 y está programada para su lanzamiento en noviembre de 2025.
EF10 está disponible como versión preliminar. Consulte notas de la versión de .NET 10 para obtener información sobre la versión preliminar más reciente. Este artículo se actualizará a medida que se publiquen nuevas versiones preliminares.
Sugerencia
Puede ejecutar y depurar los ejemplos descargando el código de ejemplo de GitHub. Cada sección siguiente vincula al código fuente específico de esa sección.
EF10 requiere el SDK de .NET 10 para compilar y requiere que se ejecute el entorno de ejecución de .NET 10. EF10 no se ejecutará en versiones anteriores de .NET y no se ejecutará en .NET Framework.
Sugerencia
Los documentos Novedades se actualizan para cada versión preliminar. Todas las muestras están configuradas para usar las compilaciones diarias de EF10, que normalmente tienen varias semanas adicionales de trabajo completado en comparación con la versión preliminar más reciente. Recomendamos encarecidamente el uso de las compilaciones diarias al probar nuevas funciones, evitando que hagas pruebas con software obsoleto.
Traducción de LINQ y SQL
Otras mejoras de consulta
- Traducción de DateOnly.ToDateTime(timeOnly) (#35194, aportado por @mseada94).
- Optimización para varios
LIMIT
consecutivos (35384), contribuido por @ranma42). - Optimización para el uso de la operación
Count
enICollection<T>
(#35381), aportado por @ChrisJollyAU).
ExecuteUpdateAsync ahora acepta una lambda regular no de expresión
El ExecuteUpdateAsync se puede usar para expresar operaciones de actualización arbitrarias en la base de datos. En versiones anteriores, los cambios que se realizarán en las filas de la base de datos se proporcionaron a través de un parámetro de árbol de expresión; esto hizo bastante difícil crear esos cambios dinámicamente. Por ejemplo, supongamos que queremos actualizar las vistas de un blog, pero condicionalmente también su nombre. Dado que el argumento setters era un árbol de expresión, era necesario escribir código como el siguiente:
// Base setters - update the Views only
Expression<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>> setters =
s => s.SetProperty(b => b.Views, 8);
// Conditionally add SetProperty(b => b.Name, "foo") to setters, based on the value of nameChanged
if (nameChanged)
{
var blogParameter = Expression.Parameter(typeof(Blog), "b");
setters = Expression.Lambda<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>>(
Expression.Call(
instance: setters.Body,
methodName: nameof(SetPropertyCalls<Blog>.SetProperty),
typeArguments: [typeof(string)],
arguments:
[
Expression.Lambda<Func<Blog, string>>(Expression.Property(blogParameter, nameof(Blog.Name)), blogParameter),
Expression.Constant("foo")
]),
setters.Parameters);
}
await context.Blogs.ExecuteUpdateAsync(setters);
La creación manual de árboles de expresión es complicada y propensa a errores y hace que este escenario común sea mucho más difícil de lo que debería haber sido. A partir de EF 10, ahora puede escribir lo siguiente en su lugar:
await context.Blogs.ExecuteUpdateAsync(s =>
{
s.SetProperty(b => b.Views, 8);
if (nameChanged)
{
s.SetProperty(b => b.Name, "foo");
}
});
Gracias a @aradalvand por proponer e insertar este cambio (en #32018).