Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 1
Регистрация: 24.02.2024
Сообщений: 131
.NET 8

Подскажите по типу ICollection в сущностях EF Core

06.08.2024, 14:33. Показов 767. Ответов 7

Студворк — интернет-сервис помощи студентам
Всем привет!

В EF принято использовать в сущности ICollection.
Ну и вообще, сам MS пишет, что нужно везде использовать интерфейсы, а не реализации.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Post
{
    public int Id { get; set; }
    public ICollection<PostTag> PostTags { get; set; } = [];
}
 
public class Tag
{
    public int Id { get; set; }
    public ICollection<PostTag> PostTags { get; set; } = [];
}
 
public class PostTag
{
    public int PostId { get; set; }
    public int TagId { get; set; }
    public Post Post { get; set; } = null!;
    public Tag Tag { get; set; } = null!;
}

Почему в примерах от MS идёт List? даже не IList, а List?
И почему их коллекции только для чтения { get; }?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Post
{
    public int Id { get; set; }
    public List<PostTag> PostTags { get; } = new();
}
 
public class Tag
{
    public int Id { get; set; }
    public List<PostTag> PostTags { get; } = new();
}
 
public class PostTag
{
    public int PostId { get; set; }
    public int TagId { get; set; }
    public Post Post { get; set; } = null!;
    public Tag Tag { get; set; } = null!;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2024, 14:33
Ответы с готовыми решениями:

.net core 3.1 / каст коллекций к типу наследника
Доброго времени суток. Вот всё немогу понять почему нельзя кастануть коллекцию к типу класса наследника. Вообщем проще показать на коде....

Подскажите по типу БП
Доброго времени суток) У меня у клиента на брендовом системнике Dell Vostro 3900 появилась проблема после скачка электричества: после...

В чем принципиальная разница между процессорами Core i3, Core i5, Core i7 и Core i9 одного поколения
Процессор нужно покупать под определенные задачи. Для игр подойдет одно, для офиса совсем другое. Знаете, в чем принципиальная разница...

7
 Аватар для Andrey-MSK
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 4
06.08.2024, 14:42
Цитата Сообщение от gazed Посмотреть сообщение
В EF принято использовать в сущности ICollection.
А как же IEnumerable<T> и IQueryable<T>?
Цитата Сообщение от gazed Посмотреть сообщение
Ну и вообще, сам MS пишет, что нужно везде использовать интерфейсы, а не реализации.
Это где они такое пишут?
Цитата Сообщение от gazed Посмотреть сообщение
Почему в примерах от MS идёт List? даже не IList, а List?
Потому что List<T> - это полноценный тип со всеми вытекающими обстоятельствами.
Цитата Сообщение от gazed Посмотреть сообщение
И почему их коллекции только для чтения { get; }?
Потому что управление коллекцией идёт через методы Add(), Remove(), RemoveAt() и index[].
1
3 / 3 / 1
Регистрация: 24.02.2024
Сообщений: 131
06.08.2024, 14:57  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А как же IEnumerable<T> и IQueryable<T>?
В них нет тех самых Add Remove

https://learn.microsoft.com/ru... avigations
Пишут именно о ICollection, а сами используют List

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Это где они такое пишут?
Ну это сама суть языка. Явно такую запись конечно не найду, хотя может она и есть.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Потому что List<T> - это полноценный тип со всеми вытекающими обстоятельствами.
Я не против что он полноценный, но это вроде как противоречит философии языка.
Я раньше везде List лепил, даже в сервисах, а оказывается так не хорошо, и начал в сервисах "стараться" использовать IEnumerable<T>.

Добавлено через 1 минуту
То есть List в сущностях EF это нормальная тема, а не просто упрощение для понимания в справке MS?
0
 Аватар для Andrey-MSK
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 4
06.08.2024, 15:15
Цитата Сообщение от gazed Посмотреть сообщение
Пишут именно о ICollection, а сами используют List
то есть любой тип, реализующий ICollection<T>.
Цитата Сообщение от gazed Посмотреть сообщение
Ну это сама суть языка.
Интерфейс это контракт, который класс, наследующийся от него, должен выполнить.
Цитата Сообщение от gazed Посмотреть сообщение
Я не против что он полноценный, но это вроде как противоречит философии языка.
Сделайте вот такое
C#
1
IList<string> MyList = new();
Что вы увидите? Нельзя создать объект интерфейса, можно только создать объект типа.
Цитата Сообщение от gazed Посмотреть сообщение
То есть List в сущностях EF это нормальная тема, а не просто упрощение для понимания в справке MS?
Почитайте про разницу между IEnumerable<T> и IQueryable<T> и всё поймёте. Когда использовать один, а когда второй.

Добавлено через 2 минуты
Цитата Сообщение от gazed Посмотреть сообщение
Пишут именно о ICollection, а сами используют List
Интерфейс ICollection<T> является базовым интерфейсом для классов в System.Collections.Generic пространстве имен.

Интерфейс ICollection<T> расширяет IList<T>IEnumerable<T>IDictionary<TKey,T Value> и представляет собой более специализированные интерфейсы, расширяющие .ICollection<T> Реализация IDictionary<TKey,TValue> представляет собой коллекцию пар "ключ-значение", например Dictionary<TKey,TValue> класс . Реализация IList<T> представляет собой коллекцию значений, и к ее членам можно получить доступ по индексу, например к классу List<T> .

Если ни IDictionary<TKey,TValue> интерфейс, ни IList<T> интерфейс не соответствуют требованиям требуемой коллекции, наследуйте новый класс коллекции от ICollection<T> интерфейса для большей гибкости.
ICollection<T> Интерфейс

Добавлено через 1 минуту
gazed, Вы не до конца понимаете что такое интерфейс, потому и путаетесь.

Добавлено через 1 минуту
gazed, И про List<T>
Реализации
ICollection<T> IEnumerable<T> IList<T> IReadOnlyCollection<T> IReadOnlyList<T> ICollection IEnumerable IList
1
3 / 3 / 1
Регистрация: 24.02.2024
Сообщений: 131
06.08.2024, 15:16  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
IList<string> MyList = new();
Ну можно сделать вот так )
C#
1
IList<string> MyList = [];
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Почитайте про разницу между IEnumerable<T> и IQueryable<T> и всё поймёте
Я в курсе о их разнице, их в этой теме мы вообще не касаемся, а только ICollection.


Давайте уточню.
В рамках EF при создании сущностей (Entity)

List<T> использую везде в EF
HashSet<T> использую, если очень большие коллекции
ICollection<T> не использую вообще

Всё верно? Это только в рамках сущностей в EF
0
 Аватар для Andrey-MSK
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 4
06.08.2024, 15:22
Цитата Сообщение от gazed Посмотреть сообщение
Всё верно? Это только в рамках сущностей в EF
Верно, если не нужна реализация IQueryable<T>.

Добавлено через 2 минуты
Цитата Сообщение от gazed Посмотреть сообщение
Ну можно сделать вот так )
Это аналогично вот этому
C#
1
2
public List<HBLaborGroup> Groups { get; }
    = new List<HBLaborGroup>();
1
3 / 3 / 1
Регистрация: 24.02.2024
Сообщений: 131
06.08.2024, 15:27  [ТС]
Andrey-MSK, спасибо!
Буду использовать только для чтения List<T>
C#
1
public List<PostTag> PostTags { get; } = new();

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Верно, если не нужна реализация IQueryable<T>.
Это что в сущности отложенные запросы?
Через сущность создавать дополнительные запросы?
Я такое не смог нигде найти даже (
0
 Аватар для Andrey-MSK
3316 / 2203 / 387
Регистрация: 14.08.2018
Сообщений: 7,410
Записей в блоге: 4
06.08.2024, 15:33
gazed, Для сущностей можете использовать всё, что реализует вот эти два интерфейса - ICollection<T> и IEnumerable<T>. Самый быстрый и лёгкий тип, который поддерживает это, List<T>.

Добавлено через 2 минуты
Цитата Сообщение от gazed Посмотреть сообщение
Это что в сущности отложенные запросы?
Через сущность создавать дополнительные запросы?
Я такое не смог нигде найти даже (
В ASP NET Core иногда используется, но очень осторожно с этим нужно, а то заспамите СУБД запросами
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2024, 15:33
Помогаю со студенческими работами здесь

Подскажите по какому типу обжата витая пара

Подскажите движок для доски обьявлений по типу irr.ru
Приветствую всех, собственно нужен движок для сайта объявлений, нашел более менее подходящий srcipt-ks, но в нем нет выбора города, нужен...

Подскажите что не так пишет ошибку преобразования к типу Число
Пишет ошибку в документе, основная идея это подсчёт неустойки по формуле общая цена товара взятая из табличной части документа * 0.01 *...

Конструкторы в сущностях. В какой конструктор будут переданы данные из бд?
Добрый день. Возник вопрос по поводу передачи параметров в конструктор сущности при извлечении данных из БД. Допустим, имеется код: ...

Подскажите к какому типу будут приведены переменные во время компиляции примера
Подскажите пожалуйста к какому типу будут приведены переменные во время компиляции примера,заранее спасибо. 1. x8 = 8 , x9 = 9 ,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru