Новые возможности EF Core 10
EF Core 10 (EF10) — следующий выпуск после EF Core 9 и запланирован на выпуск в ноябре 2025 года.
EF10 доступен в виде предварительной версии. Чтобы получить сведения о последней предварительной версии, см. заметки о выпуске .NET 10. Эта статья будет обновлена по мере доступности новых предварительных выпусков.
Совет
Вы можете запустить и отладить на примерах, скачав пример кода из GitHub. Каждый раздел ниже ссылается на исходный код, характерный для этого раздела.
EF10 требует SDK .NET 10 для сборки и среды выполнения .NET 10 для исполнения. EF10 не будет работать в более ранних версиях .NET и не будет работать в .NET Framework.
Совет
Документация "Что нового" обновляется для каждой предварительной версии. Все примеры настроены для использования ежедневных сборок EF10, которые обычно содержат несколько дополнительных недель завершенной работы по сравнению с последней предварительной версией. Мы настоятельно рекомендуем использовать ежедневные сборки при тестировании новых функций, чтобы вы не выполняли тестирование с устаревшими битами.
Трансляция LINQ и SQL
Другие улучшения запросов
- Перевод функции DateOnly.ToDateTime(timeOnly) (#35194), сделанный @mseada94.
- Оптимизация нескольких последовательных
LIMIT
(#35384), внесённая @ranma42). - Оптимизация использования операции
Count
наICollection<T>
(#35381), внесённая @ChrisJollyAU.
ExecuteUpdateAsync теперь принимает обычную лямбда-функцию, не являющуюся выражением.
ExecuteUpdateAsync можно использовать для выражения произвольных операций обновления в базе данных. В предыдущих версиях изменения, которые необходимо выполнить в строках базы данных, были предоставлены с помощью параметра дерева выражений; это заставило довольно трудно создавать эти изменения динамически. Например, предположим, что мы хотим обновить количество просмотров блога, но условно также его название. Так как аргумент setters был деревом выражений, код, например следующий, необходимо записать:
// 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);
Создание деревьев выражений вручную сложно и подвержено ошибкам, и сделало этот распространенный сценарий гораздо сложнее, чем это должно было быть. Начиная с EF 10, теперь можно написать следующее:
await context.Blogs.ExecuteUpdateAsync(s =>
{
s.SetProperty(b => b.Views, 8);
if (nameChanged)
{
s.SetProperty(b => b.Name, "foo");
}
});
Благодаря @aradalvand за предложение и настаивание на это изменение (в #32018).