В Entity Framework Core 7 представлено критическое изменение (хотя оно не указано в списке критических изменений для EF Core 7): при определении классов моделей с помощью формирования шаблонов (Scaffold-DbContext
) EF Core 7 теперь делает свойства ICollection
доступными только для чтения.
Пример кода EF 6:
public virtual ICollection<PictureData> PictureData { get; set; }
public virtual ICollection<PictureMetaData> PictureMetaData { get; set; }
Пример кода EF Core 7:
public virtual ICollection<PictureData> PictureData { get; } = new List<PictureData>();
public virtual ICollection<PictureMetaData> PictureMetaData { get; } = new List<PictureMetaData>();
У меня есть код, который присваивается этим свойствам, есть ли способ заставить Scaffold-DbContext
определить эти свойства как не только для чтения? (И я не хочу менять это вручную...)
(И есть ли причина, по которой они доступны только для чтения?)
Спасибо за любую помощь!
Вы можете настроить строительные леса, начиная с .NET 7, используя Пользовательские шаблоны обратного проектирования. Установите необходимые шаблоны:
dotnet new install Microsoft.EntityFrameworkCore.Templates
Добавьте их в свой проект (запустите из папки проекта в терминале):
dotnet new ef-templates
Найдите CodeTemplates/EFCore/EntityType.t4
и измените все навигаторы коллекции, чтобы их можно было установить (найдите все упоминания ICollection
в файле). Например:
if (navigation.IsCollection)
{
#>
public virtual ICollection<<#= targetType #>> <#= navigation.Name #> { get; set; } = new List<<#= targetType #>>();
<#
Спасибо! Я попробую. По какой причине по умолчанию они доступны только для чтения? И почему они его изменили?
@ user736570 не знаю.
@user736570 был рад помочь! Только для чтения - возможно, есть какие-то внутренние преимущества для отслеживания изменений.
Вам не нужен сеттер, вместо этого вы должны использовать Add или Remove
Спасибо @ErikEJ В чем причина? Прикрепляет ли EF некоторые события к добавлению и удалению, которые используются (возможно, для отслеживания изменений, как это было предложено другими)? И почему им потребовалось до EF 7, чтобы удалить сеттер? Теперь я немного обеспокоен тем, что у нас могут быть проблемы в нашем коде.
@ user736570 Я очень сомневаюсь, что есть критические изменения, которые имеют такой глубокий эффект, поэтому вам нужно беспокоиться. Единственное, что я могу себе представить - немного лучшую производительность при использовании методов коллекции для добавления или удаления отношений. Если использование сеттеров для отношений было такой большой проблемой, ядро EF наверняка упомянуло об этом в документации и даже представило анализатор для этого.
@GuruStron Да, я не так волнуюсь. У нас есть автоматические тесты, и там нет проблем. Очень странно, что «отсутствующий сеттер» не задокументирован здесь как критическое изменение: learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/…
На самом деле есть еще одно изменение. В EF 6 ICollections были инициализированы как HashSets: PictureData = new HashSet<PictureData>(); PictureMetaData = новый HashSet<PictureMetaData>(); Теперь они инициализируются как списки. Я понятия не имею об эффекте этого.
Я думаю, причина, по которой это только для чтения, заключается в том, что они не хотят, чтобы вы перезаписывали их прокси (если он есть). Может быть выполнено отслеживание изменений, когда вы заменяете коллекцию, которая больше не выполняется. Это мое предположение.