EF Ядро отношения один ко многим: ICollection или Hashset?

Если вы не даете какой-либо позиции родителям, то по умолчанию требуется static. Если вы хотите понять, что разница относится к этому примеру

Пример 1 ::

http://jsfiddle.net/Cr9KB/1/

   #mainall
{

    background-color:red;
    height:150px;
    overflow:scroll
}

Здесь родительский класс не имеет позиции, поэтому элемент помещается в соответствии с телом.

Пример 2 ::

http://jsfiddle.net / Cr9KB / 2 /

#mainall
{
    position:relative;
    background-color:red;
    height:150px;
    overflow:scroll
}

В этом примере родитель имеет относительное положение, поэтому элемент помещается как абсолютный внутри относительного родителя.

4
задан Deivydas Voroneckis 23 February 2019 в 10:03
поделиться

1 ответ

Лично я использую ICollection<T> для нормальных свойств, просто потому, что это хорошо известный интерфейс с минимальными издержками, т. Е. Он создает немного ICollection, а не IList. Конечно, вы можете использовать HashSet<T>, который использует EF Core, но я считаю, что HashSet установить немного сложнее, чем ICollection<T>, который требует List<T>.

Примечание: я не смотрел на скорость создания для любого из них - я просто делаю это, потому что книга «Руководства по проектированию фреймворка» демонстрирует это как лучшую практику - см. Страницу 250.

Единственное место, которое вы должны использовать HashSet<T>, если вы используете неинициализированные коллекции резервных полей, например

private HashSet<Review> _reviews;
public IEnumerable<Review> Reviews => _reviews?.ToList();

IEnumerable<T> является особым случаем, потому что он превращает коллекцию в версию только для чтения, поскольку IEnumerable не имеет метода Add или Remove. Поддержка полей плюс IEnumerable<T> (см. Код выше) позволяет вам «заблокировать» отношения коллекции, чтобы их можно было изменить только изнутри класса (см. Мою статью Управляемый доменом дизайн в EF Core ) . [+1122]

Когда я использую вспомогательные коллекции полей, я оставляю их неинициализированными, поэтому они должны быть HashSet<T>. Это позволяет мне определить, когда я забыл использовать .Include при загрузке объекта, например, если бы я загрузил книгу без .Include(p => p.Reviews) и затем обратился к свойству Reviews, я бы получил исключение нулевой ссылки. Это просто безопасный способ программирования.

Если вы инициализируете коллекцию вспомогательных полей, то это может быть ICollection и т. Д., Но я не рекомендую инициализировать коллекцию вспомогательных полей, потому что это может вызвать проблемы, если вы забудете включить и затем добавите элемент в коллекцию. В этом случае EF Core удаляет все существующие обзоры и заменяет их новыми, которые вы добавили. С точки зрения EF Core, он делает то, что вы сказали, но, скорее всего, НЕ то, что вы намеревались.

0
ответ дан Jon P Smith 23 February 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: