stringtranslate.com

Структура сущности

Entity Framework ( EF ) — это фреймворк объектно-реляционного отображения (ORM) с открытым исходным кодом [2] для ADO.NET . Первоначально он поставлялся как неотъемлемая часть .NET Framework , однако, начиная с версии Entity Framework 6.0, он поставляется отдельно от .NET Framework.

Entity Framework 6.4 был последним релизом классического фреймворка. Хотя Entity Framework 6 все еще поддерживается, он больше не разрабатывается и будет получать только исправления для проблем безопасности. [3]

В 2016 году был представлен новый фреймворк, известный как Entity Framework Core (EF Core), с похожим, но не полным паритетом функций. [4] Нумерация версий этого фреймворка была возобновлена ​​с 1.0, а последняя версия EF Core — 8.0. [5]

Обзор

Entity Framework — это набор технологий в ADO.NET , который поддерживает разработку приложений, ориентированных на данные. Архитекторы и разработчики приложений, ориентированных на данные, обычно сталкиваются с необходимостью достижения двух совершенно разных целей. Они должны моделировать сущности, отношения и логику бизнес-задач, которые они решают, а также работать с движками данных, используемыми для хранения и извлечения данных. Данные могут охватывать несколько систем хранения, каждая из которых имеет свои собственные протоколы; даже приложения, работающие с одной системой хранения, должны сбалансировать требования системы хранения с требованиями написания эффективного и поддерживаемого кода приложения. Эту проблему обычно называют «несоответствием объектно-реляционного импеданса ». [6]

Многие инструменты объектно-реляционного отображения (ORM) (они же «объектно-реляционные менеджеры») были разработаны для того, чтобы позволить разработчикам работать с данными в форме доменно-специфичных объектов и свойств, таких как клиенты и адреса клиентов, без необходимости беспокоиться о базовых таблицах и столбцах базы данных, где хранятся эти данные. С помощью ORM разработчики могут работать на более высоком уровне абстракции, когда они имеют дело с данными, и могут создавать и поддерживать приложения, ориентированные на данные, с меньшим количеством кода, чем в традиционных приложениях. Entity Framework — это решение ORM, которое в настоящее время продвигается для использования в стеке разработки Microsoft. [7]

История

Первая версия Entity Framework (EFv1) была включена в .NET Framework 3.5 Service Pack 1 и Visual Studio 2008 Service Pack 1, выпущенные 11 августа 2008 года (16 лет назад) . Эта версия подверглась широкой критике, даже вызвав «вотум недоверия», подписанный по меньшей мере тысячей разработчиков. [8] ( 2008-08-11 )

Вторая версия Entity Framework, названная Entity Framework 4.0 (EFv4), была выпущена как часть .NET 4.0 12 апреля 2010 года и устранила многие критические замечания, высказанные в отношении версии 1. [9]

Третья версия Entity Framework, версия 4.1, была выпущена 12 апреля 2011 года с поддержкой Code First.

Обновление версии 4.1 под названием Entity Framework 4.1 Update 1 было выпущено 25 июля 2011 года. Оно включает исправления ошибок и новые поддерживаемые типы.

Версия 4.3.1 была выпущена 29 февраля 2012 года. [10] Было несколько обновлений, таких как поддержка миграции.

Версия 5.0.0 была выпущена 11 августа 2012 года [11] и ориентирована на .NET framework 4.5. Также эта версия доступна для .Net framework 4, но без каких-либо преимуществ времени выполнения по сравнению с версией 4.

Версия 6.0 была выпущена 17 октября 2013 года [12] и теперь является проектом с открытым исходным кодом, лицензированным по Apache License v2. Как и ASP.NET MVC , его исходный код размещен на GitHub с использованием Git. [13] Эта версия имеет ряд улучшений для поддержки code-first. [14]

Затем Microsoft решила модернизировать, разбить на компоненты и сделать .NET кроссплатформенным для Linux, OSX и других платформ, что означало, что следующая версия Entity Framework будет полностью переписанной. [15] 27 июня 2016 года она была выпущена как Entity Framework Core 1.0, наряду с ASP.NET Core 1.0 и .NET Core 1.0. [16] Первоначально она называлась Entity Framework 7, но была переименована, чтобы подчеркнуть, что это была полная переработка, а не инкрементальное обновление, и она не заменяет EF6. [17]

Entity Framework Core 1.0 лицензирован под Apache License v2 и был полностью построен в открытом доступе на GitHub. Хотя Entity Framework Core 1.0 имеет некоторые концептуальные сходства с предыдущими версиями Entity Framework, это была совершенно новая кодовая база, разработанная для большей эффективности, мощности, гибкости и расширяемости, работающая на Windows, Linux и OSX и поддерживающая новый диапазон реляционных и NoSQL- хранилищ данных. [15]

Entity Framework Core 2.0 был выпущен 14 августа 2017 года (7 лет назад) вместе с Visual Studio 2017 15.3 и ASP.NET Core 2.0 [18] ( 2017-08-14 )

Entity Framework Core 3.0 был выпущен 23 сентября 2019 года (5 лет назад) вместе с Visual Studio 2019 16.3 и ASP.NET Core 3.0, [19] ( 2019-09-23 )

Entity Framework Core 3.1 (EF Core 3.1) был официально выпущен для использования в производственной среде 3 декабря 2019 года (4 года назад) и будет предпочтительной версией с долгосрочной поддержкой как минимум до 3 декабря 2022 года. [20] [21] ( 2019-12-03 )

Entity Framework Core 5.0 (EF Core 5) был выпущен для использования в производственной среде 9 ноября 2020 года (4 года назад) . [20] [21] Он был снят с производства и прекращена поддержка спустя 1,5 года, 10 мая 2022 года. [22] ( 2020-11-09 )

Entity Framework Core 6.0 (EF Core 6) был выпущен 10 ноября 2021 года (3 года назад) [23] [24] и будет предпочтительной версией с долгосрочной поддержкой как минимум до 12 ноября 2024 года. [25] ( 2021-11-10 )

Entity Framework Core 7.0 (EF Core 7) был выпущен 8 ноября 2022 года (2 года назад) [26] [27], добавив такие функции, как столбцы JSON и массовые обновления. ( 2022-11-08 )

Entity Framework Core 8.0 (EF Core 8) был выпущен 14 ноября 2023 года (11 месяцев назад) [28] [29], добавив такие функции, как объекты-значения с использованием сложных типов и примитивных коллекций. ( 2023-11-14 )

Архитектура

Стек ADO.NET Entity Framework.

Архитектура ADO.NET Entity Framework, снизу вверх, состоит из следующих элементов: [ необходима ссылка ]

Модель данных сущности

Модель данных сущностей ( EDM ) определяет концептуальную модель (CSDL) данных, используя технику моделирования, которая сама по себе называется Моделью данных сущностей, расширенной версией модели сущность-связь . [30] Модель данных в первую очередь описывает сущности и ассоциации , в которых они участвуют. Схема EDM выражается на языке определения схем (SDL), который является приложением XML (Расширенный язык разметки). Кроме того, также должно быть указано отображение (MSL) элементов концептуальной схемы (CSDL) в схему хранения (SSDL). Спецификация отображения также выражается на XML. [31]

Модель сущности, созданная с использованием Entity Framework 6, которая представляет таблицы «Клиент», «Заказ» и «Продукт».

Visual Studio также предоставляет Entity Designer для визуального создания EDM и спецификации сопоставления. Этот подход называется подходом «Model First» в качестве альтернативы подходам «Code First» и «Database First». Выходом инструмента является XML-файл (*.edmx), определяющий схему и сопоставление. Файл Edmx содержит артефакты метаданных EF (контент CSDL/MSL/SSDL). Эти три файла (csdl, msl, ssdl) также можно создавать или редактировать вручную. [ необходима цитата ] Подход «Model First» не будет поддерживаться в версии EF Core. [32]

Картографирование

Entity Data Model Wizard [33] в Visual Studio изначально генерирует сопоставление один к одному (1:1) между схемой базы данных и концептуальной схемой в большинстве случаев. В реляционной схеме элементы состоят из таблиц, а первичные и внешние ключи склеивают связанные таблицы вместе. Напротив, типы сущностей определяют концептуальную схему данных. [ необходима цитата ]

Типы сущностей представляют собой совокупность нескольких типизированных полей — каждое поле сопоставляется с определенным столбцом в базе данных — и могут содержать информацию из нескольких физических таблиц. Типы сущностей могут быть связаны друг с другом, независимо от отношений в физической схеме. Связанные сущности также раскрываются аналогичным образом — через поле, имя которого обозначает отношение, в котором они участвуют и к которому получают доступ, которое вместо извлечения значения из некоторого столбца в базе данных обходит отношение и возвращает сущность (или набор сущностей), с которой оно связано. [ необходима цитата ]

Типы сущностей образуют класс объектов, которым соответствуют сущности, причем сущности являются экземплярами типов сущностей. Сущности представляют отдельные объекты, которые составляют часть проблемы, решаемой приложением, и индексируются ключом. Например, преобразуя описанную выше физическую схему, мы получим два типа сущностей:

Логическая схема и ее сопоставление с физической схемой представлены в виде модели данных сущностей (EDM), заданной как XML-файл. ADO.NET Entity Framework использует EDM для фактического выполнения сопоставления, позволяя приложению работать с сущностями, при этом внутренне абстрагируя использование конструкций ADO.NET, таких как DataSet и RecordSet . ADO.NET Entity Framework выполняет соединения, необходимые для получения справочной информации о сущностях из нескольких таблиц или при обходе связи. Когда сущность обновляется, она отслеживает, из какой таблицы поступила информация, и выдает операторы обновления SQL для обновления таблиц, в которых были обновлены некоторые данные. ADO.NET Entity Framework использует eSQL, производную от SQL, для выполнения запросов, операций с теорией множеств и обновлений сущностей и их связей. Запросы в eSQL, если требуется, затем транслируются в собственный вариант SQL базовой базы данных. [ необходима цитата ]

Типы сущностей и наборы сущностей просто формируют логическую схему EDM и могут быть представлены как что угодно. ADO.NET Entity Framework включает Object Service , которая представляет эти сущности как объекты с элементами и отношениями, представленными как свойства. Таким образом, объекты Entity являются просто интерфейсом для экземпляров типов сущностей EDM, что позволяет объектно-ориентированным языкам получать к ним доступ и использовать их. Аналогичным образом могут быть созданы другие интерфейсы, которые представляют сущности через веб-службы (например, WCF Data Services ) или XML, который используется, когда сущности сериализуются для постоянного хранения или передачи по проводам. [34]

Сущности

Entities** являются экземплярами EntityType s; они представляют отдельные экземпляры объектов (таких как customer , orders ), к которым относится информация. Идентичность сущности определяется типом сущности, экземпляром которого она является; в этом смысле тип сущности определяет класс, к которому принадлежит сущность, а также определяет, какие свойства будет иметь сущность. Свойства описывают некоторые аспекты сущности, давая ей имя и тип. Свойства типа сущности в ADO.NET Entity Framework полностью типизированы и полностью совместимы с системой типов, используемой в системе СУБД, а также с Common Type System .NET Framework. Свойство может быть SimpleType или ComplexType , а также может быть многозначным. Все EntityType s принадлежат некоторому пространству имен и имеют свойство EntityKey , которое уникально идентифицирует каждый экземпляр типа сущности. Различные типы свойств различаются следующим образом: [ необходима цитата ]

Все экземпляры сущностей размещаются в EntityContainers, которые являются контейнерами для сущностей на уровне проекта. Каждый проект имеет один или несколько именованных EntityContainers, которые могут ссылаться на сущности в нескольких пространствах имен и типах сущностей. Несколько экземпляров одного типа сущности могут храниться в коллекциях, называемых EntitySets. Один тип сущности может иметь несколько EntitySets. [ необходима цитата ]

Примитивные типы EDM (простые типы): [35] [37]

Отношения

Любые два типа сущностей могут быть связаны либо отношением Ассоциации , либо отношением Включения . Например, счет за поставку, выставленный клиенту, является ассоциацией, тогда как заказ содержит детали заказа, является отношением Включения. Отношение Включения также может использоваться для моделирования наследования между сущностями. Отношение между двумя типами сущностей указывается Типом Отношения , экземпляры которого, называемые Отношениями , связывают экземпляры сущностей. В будущих выпусках могут быть введены другие виды типов отношений, такие как Состав или Идентификация . [ необходима цитата ]

Типы отношений характеризуются степенью (арностью) или количеством типов сущностей, которые они связывают, и их множественностью. Однако в первоначальном выпуске ADO.NET Entity Framework отношения ограничены бинарными (степени два) двунаправленными отношениями. Множественность определяет, сколько экземпляров сущностей могут быть связаны друг с другом. В зависимости от множественности отношения могут быть либо один к одному, либо один ко многим, либо многие ко многим. Отношения между сущностями именуются; имя называется Ролью. Оно определяет цель отношения. [ необходима цитата ]

Тип отношения может также иметь связанную с ним Операцию или Действие , что позволяет выполнять некоторые действия над сущностью в случае выполнения действия над связанной сущностью. Отношение может быть указано для выполнения Действия , когда некоторая Операция выполняется над связанной сущностью. Например, при удалении сущности, которая является частью отношения ( операция OnDelete ), могут быть выполнены следующие действия: [38]

Для ассоциативных отношений, которые могут иметь различную семантику на обоих концах, для каждого конца могут быть указаны различные действия. [ необходима цитата ]

Язык определения схемы

ADO.NET Entity Framework использует основанный на XML язык определения данных, называемый языком определения схем (SDL), для определения схемы EDM. SDL определяет SimpleTypes, похожие на примитивные типы CTS , включая String , Int32 , Double , Decimal , Guid и DateTime , среди прочих. Enumeration , который определяет карту примитивных значений и имен, также считается простым типом. Перечисления поддерживаются только с версии фреймворка 5.0 и выше. ComplexTypes создаются из агрегации других типов. Коллекция свойств этих типов определяет Entity Type. Это определение можно записать в грамматике EBNF следующим образом: [ необходима цитата ]

EntityType :: =  ENTITYTYPE entityTypeName [ BASE entityTypeName ]  [ ABSTRACT true | false ]  KEY propertyName [,  propertyName ] *  {( propertyName PropertyType [ PropertyFacet ] * )  + }PropertyType ::=  (  ( PrimitiveType [ PrimitiveTypeFacets ] * )  |  ( complexTypeName )  |  RowType PropertyFacet ::=  (  [ NULLABLE true |  false ]  |  [ DEFAULT defaultVal ]  |  [ MULTIPLICITY [ 1 | * ]]  ) PropertyTypeFacet ::=  MAXLENGTH |  PRECISION |  SCALE  |  UNICODE |  FIXEDLENGTH |  COLLATION  |  DATETIMEKIND |  PRESERVESECONDS PrimitiveType ::=  BINARY |  STRING |  BOOLEAN  |  SINGLE |  DOUBLE |  DECIMAL |  GUID  |  BYTE |  SBYTE |  INT16 |  INT32 |  INT64  |  DATETIME |  DATETIMEOFFSET |  TIME )

Фасеты используются для описания метаданных свойства, например, является ли оно обнуляемым или имеет значение по умолчанию, а также кардинальности свойства, т. е. является ли свойство однозначным или многозначным. Множественность «1» обозначает однозначный объект; «*» означает, что объект многозначный. Например, сущность может быть обозначена в SDL как: [39]

<ComplexType Имя= "Addr" > < Имя свойства= "Street" Тип= "String" Nullable= "false" /> < Имя свойства= "City" Тип= "String" Nullable= "false" /> < Имя свойства= "Country" Тип= "String" Nullable= "false" /> < Имя свойства= "PostalCode" Тип= "Int32" /> </ComplexType> < Имя сущности= "Customer" > <Ключ> <Имя свойстваRef Имя= "Email" /> </Ключ> <Имя свойства = "Name" Тип= "String" /> < Имя свойства= "Email" Тип= "String" Nullable= "false" /> < Имя свойства= "Address" Тип= "Addr" /> </EntityType>                                       

Тип отношения определяется как указание конечных точек и их кратностей. Например, отношение «один ко многим» между Customer и Orders может быть определено как

<Имя ассоциации = "CustomerAndOrders" > <Конечный тип = "Customer" Множественность = "1" /> <Конечный тип = "Orders" Множественность = "*" > < Действие при удалении = "Каскад" /> </Конец > </Ассоциация>            

Запрос данных

SQL-сущность

ADO.NET Entity Framework использует вариант языка структурированных запросов , называемый Entity SQL , который нацелен на написание декларативных запросов и обновлений по сущностям и отношениям сущностей – на концептуальном уровне. Он отличается от SQL тем, что не имеет явных конструкций для объединений , поскольку EDM разработан для абстрагирования разбиения данных по таблицам. [ необходима цитата ]

Запросы по концептуальной модели облегчаются классами EntityClient , которые принимают запрос Entity SQL. Конвейер запросов разбирает запрос Entity SQL в дерево команд, разделяя запрос по нескольким таблицам, которое передается поставщику EntityClient. Как и поставщики данных ADO.NET, поставщик EntityClient также инициализируется с помощью объекта Connection , который в дополнение к обычным параметрам хранилища данных и информации аутентификации требует схему SDL и информацию о сопоставлении. Поставщик EntityClient, в свою очередь, затем преобразует дерево команд Entity SQL в запрос SQL в собственном виде базы данных. Затем выполнение запроса возвращает Entity SQL ResultSet, который не ограничивается табличной структурой, в отличие от ADO.NET ResultSets. [ необходима цитата ]

Entity SQL улучшает SQL, добавляя внутреннюю поддержку для: [ необходима цитата ]

Канонические функции Entity SQL

Канонические функции поддерживаются всеми поставщиками данных, совместимыми с Entity Framework. Их можно использовать в запросе Entity SQL. Кроме того, большинство методов расширения в LINQ to Entities транслируются в канонические функции. Они не зависят от какой-либо конкретной базы данных. Когда поставщик данных ADO.NET получает функцию, он транслирует ее в требуемый оператор SQL. [40]

Но не все СУБД имеют эквивалентную функциональность и набор стандартных встроенных функций. Также существуют различия в точности вычислений. Поэтому не все канонические функции поддерживаются для всех баз данных, и не все канонические функции возвращают одинаковые результаты. [ необходима цитата ]

LINQ для сущностей

Поставщик LINQ to Entities позволяет использовать LINQ для запроса различных источников данных RDBMS . Доступны несколько поставщиков, специфичных для серверов баз данных с поддержкой Entity Framework. [ необходима цитата ]

Собственный SQL

В Entity Framework v4 в класс ObjectContext были добавлены новые методы ExecuteStoreQuery() и ExecuteStoreCommand() . [ необходима ссылка ]

Визуализаторы

В Visual Studio есть функция Visualizer. Запрос LINQ, написанный в Visual Studio, можно просмотреть как собственный SQL с помощью Visualizer во время сеанса отладки. Визуализатор для LINQ to Entities (Object Query), ориентированный на все СУБД, доступен в Visual Studio Marketplace. [41]

Профилирование производительности

На рынке доступны различные профилировщики для устранения проблем с производительностью с использованием Entity Framework, как для вариантов EF, так и для EF Core.

Инструменты и расширения - Entity Framework Core

Доступны инструменты и расширения Entity Framework Core для повышения производительности Entity Framework Core. [42]

Инструменты и расширения - Entity Framework EF6

Инструменты и расширения Entity Framework доступны для повышения производительности Entity Framework. [43]

Смотрите также

Ссылки

  1. ^ "Релизы · dotnet/efcore · GitHub". GitHub .
  2. ^ Крилл, Пол (20 июля 2012 г.). «Microsoft open-sources Entity Framework». InfoWorld . Получено 24 июля 2012 г.
  3. ^ ajcvickers (9 марта 2022 г.). «Политики поддержки Entity Framework». learn.microsoft.com . Получено 12.12.2022 .
  4. ^ ajcvickers. "Сравните EF6 и EF Core". learn.microsoft.com . Получено 12.12.2022 .
  5. ^ ajcvickers (14 ноября 2023 г.). "Что нового в EF Core 8". learn.microsoft.com . Получено 14.11.2023 .
  6. ^ "Несоответствие объектно-реляционного импеданса". AgileData.org . Получено 2022-12-12 .
  7. ^ mcleblanc (15 сентября 2021 г.). "Обзор Entity Framework - ADO.NET". learn.microsoft.com . Получено 12.12.2022 .
  8. ^ "Подписанты вотума недоверия Entity Framework | Wufoo". efvote.wufoo.com . Получено 12.12.2022 .
  9. ^ "Обновление Entity Framework в .NET 4 и Visual Studio 2010". Блог команды ADO.NET. 11 мая 2009 г. Архивировано из оригинала 20 января 2010 г. Получено 1 ноября 2011 г.
  10. ^ "EF4.3.1 и EF5 Beta 1 доступны на NuGet". Блог команды ADO.NET. 29 февраля 2012 г. Архивировано из оригинала 25 марта 2012 г. Получено 27 марта 2012 г.
  11. ^ "EF5 доступен на CodePlex". 11 августа 2012 г. Архивировано из оригинала 7 сентября 2017 г. Получено 20 марта 2014 г.
  12. ^ "EF6 RTM Available". 17 октября 2013 г. Архивировано из оригинала 2014-03-30.
  13. ^ "Entity Framework - Главная". GitHub . 14 сентября 2016 г.
  14. ^ ajcvickers (14 октября 2020 г.). "Что нового - EF6". learn.microsoft.com . Получено 12.12.2022 .
  15. ^ ab "EF7 - Новые платформы, новые хранилища данных". 19 мая 2014 г. Архивировано из оригинала 29-09-2015.
  16. ^ "Entity Framework Core 1.0.0 доступен". 27 июня 2016 г.
  17. ^ Хансельман, Скотт. «ASP.NET 5 мертв — Знакомимся с ASP.NET Core 1.0 и .NET Core 1.0 — Скотт Хансельман». www.hanselman.com . Получено 11 июля 2016 г.
  18. ^ "Анонс .NET Core 2.0". Блог .NET. 14 августа 2017 г.
  19. ^ "Анонс .NET Core 3.0". Блог .NET. 23 сентября 2019 г.
  20. ^ ab ajcvickers. "План для Entity Framework Core 5.0". learn.microsoft.com . Получено 2022-12-12 .
  21. ^ ab "Microsoft.EntityFrameworkCore 5.0.0". nuget.org . Получено 2022-12-12 .
  22. ^ «Entity Framework Core Releases and Planning». Декабрь 2023 г.
  23. ^ ajcvickers. "План для Entity Framework Core 6.0". learn.microsoft.com . Получено 2022-12-12 .
  24. ^ "Microsoft.EntityFrameworkCore 6.0.0". nuget.org . Получено 2022-12-12 .
  25. ^ ajcvickers. "Выпуски и планирование EF Core". learn.microsoft.com . Получено 12.12.2022 .
  26. ^ Рот, Дэниел (2022-11-08). "Анонс ASP.NET Core в .NET 7". Блог .NET . Получено 2022-12-12 .
  27. ^ ajcvickers. "Что нового в EF Core 7.0". learn.microsoft.com . Получено 12.12.2022 .
  28. ^ Артур, Викерс (14.11.2023). «Entity Framework Core 8 (EF8) доступен сегодня». Блог . NET . Получено 14.11.2023 .
  29. ^ ajcvickers (14 ноября 2023 г.). "Что нового в EF Core 8". learn.microsoft.com . Получено 14.11.2023 .
  30. ^ "Entity Data Model". MSDN, Microsoft. 2 августа 2012 г. Получено 15 августа 2013 г.
  31. ^ Спецификации CSDL, SSDL и MSL, MSDN , заархивировано из оригинала 2010-11-08 , извлечено 2010-12-06
  32. ^ ajcvickers (09.03.2022). "Перенос с EF6 на EF Core — перенос модели на основе EDMX — EF". learn.microsoft.com . Получено 07.06.2024 .
  33. ^ Entity Data Model Wizard, MSDN , получено 2010-12-06
  34. ^ Kogent Solutions Inc. (2009), ASP.NET 3.5 Black Book , Dreamtech Press, ISBN 978-81-7722-831-1
  35. ^ ab Simple Types (EDM), MSDN , получено 2010-12-06
  36. ^ Элемент ComplexType (CSDL), MSDN , получено 06.12.2010
  37. ^ Концептуальные типы моделей, MSDN , получено 2010-12-06
  38. ^ OnDelete Element (CSDL), MSDN , получено 2010-12-06
  39. ^ Facets (CSDL), MSDN , получено 2010-12-06
  40. ^ ab Канонические функции (Entity SQL), MSDN , получено 29.03.2010
  41. ^ "Визуализатор запросов Linq to Entity - Visual Studio Marketplace". marketplace.visualstudio.com . Получено 2022-12-12 .
  42. ^ ErikEJ. "Инструменты и расширения - EF Core". learn.microsoft.com . Получено 12.12.2022 .
  43. ^ ajcvickers (9 марта 2022 г.). "Инструменты и расширения - EF6". learn.microsoft.com . Получено 12.12.2022 .

Библиография

Внешние ссылки