До того, как я попал в этот курс, когда я услышал слово «база данных», все, что пришло мне на ум, было чем-то, что хранит информацию. Мне это казалось, как и большинство других технологических вещей — волшебством! Мне понравилось погрузиться в Entity Framework и узнать больше о том, что происходит, когда он взаимодействует с базами данных. Хотя я больше не вижу в этом волшебства, я определенно вижу, что, как и в большинстве вещей, под капотом происходит многое. Итак, давайте продолжим, по крайней мере, касаться различных аспектов Entity Framework в вопросах инструктора на этой неделе.

  1. Обсудите словами то, что вы узнали на уроке сегодня или на этой неделе.

На прошлой неделе, изучая и реализуя отношения в Entity Framework, я заметил несколько вещей. Одним из них является то, как вы структурируете свой запрос LINQ при включении связанных данных. Например, на мой взгляд, было бы более разумно сначала вызвать объект объекта, а затем сказать .Include его связанные данные, например так:

Однако правильная структура заключается в том, чтобы сообщить EF, что вам нужен объект с включенными связанными данными, а затем фактически запросить указанный объект, что теперь имеет большой смысл. Вы не можете получить объект от EF, а затем сказать: «О, да, и не могли бы вы также дать мне другие вещи?» EF говорит: «Нет, я уже дал вам ваш объект, уберите или сделайте еще один запрос». вот так… Таким образом, запрос должен выглядеть так:

Еще одно небольшое открытие, с которым я столкнулся, произошло при попытке проверить внешний ключ в модели books, указывающий на модель автора. Я поместил атрибут [Required] в свойство AuthorId, однако при тестировании Postman Post книги без AuthorId не привело к выданному исключению, напечатанному в ответ, а вместо этого выдало ошибку в моем коде внутри Visual Studio. Итак, я некоторое время тестировал так и эдак и понял, что атрибут [Required], похоже, не делает то же самое для внешних ключей. Вместо этого я написал в свой BookService.cs оператор if, оценивающий, является ли AuthorId == 0. Почему 0? Ну, сначала я собирался пойти на null, но потом мне напомнили, что типы значений не могут быть нулевыми, если вы не делаете int?, чего я хотел избежать в основном только ради того, чтобы попытаться выяснить, как я этого не сделал уже знаете. Я столкнулся с обсуждением переполнения стека о значении int по умолчанию, некоторые говорили 0 или -1, в то время как кто-то совершенно уверенно утверждал, что это 0. Итак, я попробовал, и это сработало!!

2. В чем разница между Entity Framework и LINQ to SQL?

Между EF и LINQ to SQL есть довольно существенные различия. Вот некоторые из них:

  • EF может взаимодействовать с различными структурами реляционных баз данных, включая Oracly, MySQL, SQL и DB2. Однако LINQ to SQL может взаимодействовать только с SQL Server.
  • Как мы знаем, EF создает базы данных на основе классов моделей, которые мы разрабатываем. С другой стороны, LINQ to SQL не может этого сделать.
  • Существует небольшая разница в классах, используемых для взаимодействия с базами данных. LINQ to SQL использует класс контекста данных, а EF использует класс DbContext.
  • EF слабо связан, что означает, что в EF модули и классы зависят от абстракций, а не от других модулей или классов. Это обеспечивает повышенную гибкость, а также ремонтопригодность. LINQ to SQL имеет больше «жестко запрограммированных» зависимостей, что делает его тесно связанным.
  • LINQ to SQL ограничен в своем реляционном отображении, поддерживая только отношения 1 к 1. В то время как EF может поддерживать 1 к 1, 1 ко многим, многие к 1, многие ко многим.
  • Оба они медленны для первого запроса, однако EF, как правило, имеет более высокую производительность, чем LINQ to SQL.
  • LINQ to SQL обеспечивает более быструю разработку, в то время как EF обычно медленнее в этом отношении.

На мой взгляд, хотя LINQ to SQL имеет свое место и полезен, EF побеждает в конкурсе ORM из-за своих расширенных возможностей.

3. Где мы используем виртуальные свойства в моделях Entity Framework DbContext?

Ключевое слово virtual используется для связанных свойств данных, чтобы обеспечить отложенную загрузку и отслеживание изменений. Причина, по которой вам необходимо объявлять такие свойства как виртуальные, заключается в том, что EF может создавать производные подклассы из ваших POCO; новые типы создаются из ваших типов POCO. Это известно как создание прокси-серверов POCO. Прокси — это, по сути, объекты, которые представляют другие объекты. Что EF делает с этими прокси? Прокси-сервер используется для переопределения виртуальных свойств POCO, чтобы «вставить ловушки для автоматического выполнения действий при доступе к свойству» (docs.microsoft.com).

Это означает, что контент загружается на основе действия. Вместо того, чтобы явно указывать контексту включать или загружать связанные данные, вы указываете контексту загружать указанные данные, когда и если придет время. Хотя у этого есть некоторые недостатки, такие как немного более сложный код и возможные проблемы с SEO-индексированием, преимуществом является то, что ресурсы, такие как время и память, управляются более эффективно, что позволяет в целом улучшить взаимодействие с пользователем. Пример с geeksforgeeks.org — это веб-сайт, который загружает контент на основе прокрутки.

4. В чем смысл Pluralize и Singularize в Entity Framework?

Множественное и единственное число в контексте EF касается соглашений об именах для ваших сущностей. Когда вы создали свой DbContext, вы создаете DbSets. Итак, для нашего Book API есть DbSet с именем Books и другой DbSet с именем Authors, оба в файле BookContext.cs, который наследуется от DbContext. Хотя в вашей компании могут быть правила именования, похоже, что различие между использованием Pluralize (Книги, Авторы) и Singularize (Книга, Автор) является предпочтительным.

Я рассматриваю DbSet как набор, потому что… это один. По крайней мере, до сих пор я работал только с DbSet как с коллекциями объектов сущностного типа. Таким образом, DbSet Books содержит все объекты типа книги сущности, а Authors содержит объекты типа автора сущности. Комментатор Stack Overflow заметил, что кто-то может рассматривать набор как единую таблицу и, следовательно, захотеть использовать единственное имя набора. В любом случае, с EF4+ у вас есть возможность установить флажок, который будет автоматизировать множественное или единственное число имен ваших объектов.

5. Что нового в Entity Framework 6?

EF6 имеет довольно много ценных изменений по сравнению с предшественниками. Приятным преимуществом версии 6 является то, что она больше не привязана к .NET Framework. Вы можете установить его как пакет с помощью диспетчера пакетов NuGet для своих различных проектов. Вы также обнаружите, что в приложениях с более сложными таблицами и связями объекты контекста обычно открываются быстрее, а проблемы с соединением лучше изолированы. Вот несколько других новых функций:

  • Вы можете выполнять обновления таблиц базы данных с помощью хранимых процедур при вызове SaveChanges(). Это известно как «отображение хранимых процедур».
  • Возможность настройки соглашений и значений по умолчанию
  • Перехват запросов и последующее их изменение
  • Теперь вы можете настроить EF в коде, создав класс, который наследуется от DbConfiguration и реализует код конфигурации в конструкторе. Раньше для создания конфигураций приходилось возиться с файлами XML.
  • Поддерживает имитацию вызовов EF для лучшей разработки через тестирование.
  • При использовании с .NET Framework 4.5 выполняется асинхронная обработка запросов в фоновых потоках.

(visualstudiomagazine.com)

Чтобы получить дополнительные инструкции о том, как воспользоваться преимуществами вышеупомянутых новых функций, посетите такие сайты, как dotnetcurry.com и entityframeworktutorial.net.

Что ж, надеюсь, вы сможете сохранить кое-что из того, что мы сегодня обсуждали, в своей ментальной базе данных. Ждем вас на следующей неделе.

Ура!