Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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
Поддержка полнотекстового поиска
Azure Cosmos DB теперь предлагает поддержку полнотекстового поиска. Он обеспечивает эффективный и эффективный поиск текста, а также оценку релевантности документов к заданному поисковому запросу. Его можно использовать в сочетании с векторным поиском для повышения точности ответов в некоторых сценариях ИИ. EF Core 10 добавляет поддержку этой функции, позволяя моделировать базу данных с включенными свойствами полнотекстового поиска и использовать функции полнотекстового поиска в запросах, предназначенных для Azure Cosmos DB.
Ниже приведена базовая конфигурация модели EF, позволяющая выполнять полнотекстовый поиск по одному из свойств:
public class Blog
{
...
public string Contents { get; set; }
}
public class BloggingContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>(b =>
{
b.Property(x => x.Contents).EnableFullTextSearch();
b.HasIndex(x => x.Contents).IsFullTextIndex();
});
}
}
После настройки модели можно использовать операции полнотекстового поиска в запросах с помощью методов, предоставленных в EF.Functions
:
var cosmosBlogs = await context.Blogs.Where(x => EF.Functions.FullTextContains(x.Contents, "cosmos")).ToListAsync();
В настоящее время поддерживаются следующие полнотекстовые операции: FullTextContains
, FullTextContainsAll
, FullTextContainsAny
. FullTextScore
Дополнительные сведения о полнотекстовом поиске Cosmos см. в документации.
Гибридный поиск
EF Core теперь поддерживает функцию RRF
(Reciprocal Rank Fusion), которая объединяет векторный поиск сходства и полнотекстовый поиск (т. е. гибридный поиск). Ниже приведен пример запроса с помощью гибридного поиска:
float[] myVector = /* generate vector data from text, image, etc. */
var hybrid = await context.Blogs.OrderBy(x => EF.Functions.Rrf(
EF.Functions.FullTextScore(x.Contents, "database"),
EF.Functions.VectorDistance(x.Vector, myVector)))
.Take(10)
.ToListAsync();
Дополнительные сведения о гибридном поиске Cosmos см. в документации.
Поиск сходства векторов выходит из стадии предварительного просмотра
В EF9 мы добавили экспериментальную поддержку поиска сходства векторов. В EF Core 10 поддержка поиска сходства векторов больше не экспериментальна. Мы также улучшили эту функцию:
- EF Core теперь может создавать контейнеры с векторными свойствами, определенными в собственных ссылочных сущностях. Контейнеры с векторными свойствами, определенными в собственных коллекциях, по-прежнему должны создаваться другими средствами. Однако их можно использовать в запросах.
- API сборки моделей были переименованы. Теперь свойство вектора можно настроить с помощью метода
IsVectorProperty
, а индекс вектора можно настроить с помощью методаIsVectorIndex
.
Дополнительные сведения о поиске векторов Cosmos см. в документации.
Улучшенный интерфейс при развитии модели
В предыдущих версиях 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
s (#35384, внесенных @ranma42). - Оптимизируйте использование
Count
операции наICollection<T>
(#35381, внесено @ChrisJollyAU). - Оптимизируйте
MIN
/MAX
надDISTINCT
(#34699, внес вклад @ranma42). - Перевод функций даты и времени с помощью
DatePart.Microsecond
иDatePart.Nanosecond
аргументов (#34861). - Упростите имена параметров (например, из
@__city_0
city
) (#35200). - Переведите
COALESCE
какISNULL
в SQL Server для большинства случаев (#34171, с участием @ranma42). - Поддерживают некоторые строковые функции, принимающие
char
в качестве аргументов (#34999, внесенные @ChrisJollyAU). - Поддержка
MAX
/MIN
/ORDER BY
с использованиемdecimal
в SQLite (#35606, предоставлено @ranma42). - Поддержка проецирования различных навигаций (но одного типа) с помощью условного оператора (#34589, внесено @ranma42).
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).
Пользовательские имена ограничений по умолчанию
В предыдущих версиях EF Core при указании значения по умолчанию для свойства EF Core всегда позволяет базе данных автоматически создавать имя ограничения. Теперь можно явно указать имя ограничений значений по умолчанию для SQL Server, что дает вам больше контроля над схемой базы данных.
Теперь можно указать имя ограничения при определении значений по умолчанию в конфигурации модели:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.IsActive)
.HasDefaultValue(true, "DF_Blog_IsActive");
modelBuilder.Entity<Post>()
.Property(p => b.CreatedDate)
.HasDefaultValueSql("GETDATE()", "DF_Post_CreatedDate");
}
Вы также можете вызвать UseNamedDefaultConstraints
для включения автоматического именования всех ограничений по умолчанию. Обратите внимание, что если у вас есть существующие миграции, то следующая миграция переименует каждое ограничение по умолчанию в вашей модели.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.UseNamedDefaultConstraints();
}
Другие улучшения
- Сделать шаблоны SQL Server совместимыми с Azure Data Explorer (#34832, внесённого @barnuri).
- Свяжите DatabaseRoot с экземпляром параметров с областью действия, а не с одноэлементными параметрами (#34477, внесенных @koenigst).
- Редактировать встраиваемые константы из журнала при выключении конфиденциального ведения журнала (#35724).
- Улучшение LoadExtension для корректной работы с dotnet run и библиотеками, начинающимися с lib* (#35617, внесённое @krwq).
- Изменения использования AsyncLocal для повышения производительности отложенной загрузки (#35835, внесены @henriquewr).