Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
EF Core 10 (EF10) — следующий выпуск после EF Core 9 и запланирован на выпуск в ноябре 2025 года.
EF10 доступен в виде предварительной версии. См. заметки о выпуске .NET 10, чтобы получить сведения о последней предварительной версии. Эта статья будет обновлена по мере доступности новых предварительных выпусков.
Совет
Вы можете запустить и отладить на примерах, скачав пример кода из GitHub. Каждый раздел ниже ссылается на исходный код, характерный для этого раздела.
EF10 требует SDK .NET 10 для сборки и среды выполнения .NET 10 для исполнения. EF10 не будет работать в более ранних версиях .NET и не будет работать в .NET Framework.
Azure Cosmos DB для NoSQL
Улучшенный интерфейс при развитии модели
В предыдущих версиях EF Core эволюционирование модели при использовании Azure Cosmos DB было довольно болезненным. В частности, при добавлении нового необходимого свойства в сущность EF больше не сможет материализовать ее. Причина заключается в том, что EF ожидал значение нового свойства (так как это было необходимо), но документ, созданный до изменения, не содержал этих значений. Обходной путь заключается в том, чтобы пометить свойство как необязательное сначала, вручную добавить значения по умолчанию для свойства, а затем изменить его на обязательный.
В EF 10 мы улучшили этот интерфейс. EF теперь материализует значение по умолчанию для обязательного свойства, если для него нет данных в документе, а не бросает.
Трансляция LINQ и SQL
Поддержка операторов .NET 10 LeftJoin
и RightJoin
LEFT JOIN
— это распространенная и полезная операция при работе с EF Core. В предыдущих версиях реализация LEFT JOIN
в LINQ была довольно сложной, требуя SelectMany
, GroupJoin
и DefaultIfEmpty
операций в определенной конфигурации.
.NET 10 добавляет поддержку LINQ на первоклассном уровне для метода LeftJoin
, что значительно упрощает их написание. EF Core распознает новый метод, поэтому его можно использовать в запросах EF LINQ вместо старой конструкции:
var query = context.Students
.LeftJoin(
context.Departments,
student => student.DepartmentID,
department => department.ID,
(student, department) => new
{
student.FirstName,
student.LastName,
Department = department.Name ?? "[NONE]"
});
Примечание.
EF 10 также поддерживает аналогичный оператор RightJoin
, который сохраняет все данные из второй коллекции и только соответствующие данные из первой коллекции. EF 10 преобразует это в операцию RIGHT JOIN
в базе данных.
Дополнительные сведения см. в #12793 и #35367.
Другие улучшения запросов
- Перевод функции DateOnly.ToDateTime(timeOnly) (#35194), сделанный @mseada94.
- Оптимизация для нескольких последовательных
LIMIT
(#35384, вклад в проект от @ranma42). - Оптимизация использования операции
Count
наICollection<T>
(#35381, внесённая @ChrisJollyAU). - Оптимизация
MIN
/MAX
надDISTINCT
(#34699, вклад внес @ranma42). - Перевод функций даты и времени с помощью аргументов
DatePart.Microsecond
иDatePart.Nanosecond
(#34861). - Упрощение имен параметров (например, от
@__city_0
доcity
) (#35200).
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).
Другие улучшения
- Сделать шаблоны SQL Server совместимыми с Azure Data Explorer (#34832, внесённого @barnuri).
- Свяжите DatabaseRoot с экземпляром параметров с областью действия, а не с одноэлементными параметрами (#34477, внесенных @koenigst).
- Редактировать встраиваемые константы из журнала при выключении конфиденциального ведения журнала (#35724).
- Улучшение LoadExtension для корректной работы с dotnet run и библиотеками, начинающимися с lib* (#35617, внесённое @krwq).