Ado net entity data model нет в visual studio 2019
Итак, создаем обычное консольное приложение. Присваиваем ему имя test1. Добавляем в проект модель данных.
, называем ее MyEFModel.edmx.
1)
Entity Name = User
Entity Set = Users
Остальные свойства оставим без изменений. Заметим лишь, что по умолчанию дизайнер модели создает первичный ключ Id целочисленного типа, что для нас вполне приемлемо.
Добавляем в эту сущность свойства(Properties):
Login (Type = String, Max Length = 255)
Registered (Type = DateTime)
Свойства добавляются в контекстном меню самой сущности (Add -> Scalar Property).2)
Entity Name = Group
Entity Set = Groups
Свойства:
Name (Type = String, Max Length = 255)3)
Entity Name = Right Entity Set = Rights
Свойства:
Description (Type = String, Max Length = 255)
Итак, теперь у нас есть три сущности, пока еще не связанные друг с другом. Займемся этим вопросом.
Создаем связи (Add -> Association):
Вот какая схема данных у нас появилась:
Ну что же, модель данных готова. Но чтобы начать писать программный код, оперирующий с данными, нужно для начала создать саму базу данных. Используя Visual Studio2010 сделать это очень легко.
После работы мастера мы получили следующее:
1) скрипт схемы данных в файле MyEFModel.edmx.sql,
2) строка подключения MyEFModelContainer в файле App.config (откройте его и посмотрите в раздел сonnectionStrings)
3) пока еще пустая база данных EFUSERS.
Мастер всего лишь создает, но не выполняет DDL-скрипт и это правильно, потому что скрипт этот при выполнении уничтожает все данные в БД. Понятно, что при первом выполнении скрипта это нормально, ведь данных в БД еще нет. Но вот при последующих изменениях в модели данных и генерации новой схемы данных это может сыграть роковую роль и уничтожить все созданные ранее данные в базе. В последующих статьях мы еще рассмотрим способы внесения изменений в БД без потери существующих данных.
Я не буду приводить здесь DDL-скрипт, сгенерированный студией, но он доступен для ознакомления по ссылке MyEFModel.edmx
Ну вот, вся предварительная работа сделана, модель данных нарисована, схема данных создана, пустые таблицы в БД присутствуют. Осталось теперь попробовать поработать со всем этим добром.
Чтобы обратиться к данным в БД, нужно создать экземпляр контейнера модели. Класс контейнера называется MyEFModelContainer, инстанцируем его:
В качестве аргумента конструктора мы задаем имя строки подключения к БД. Эта строка подключения представляет собой нечто большее, чем обычная ConnectionString для подключения к базе данных, потому что в нашем случае используется провайдер System.Data.EntityClient, которому для инициализации требуется гораздо больше параметров. Строка подключения была создана мастером ранее и хранится в файле App.config, строка подключения выглядит так:
metadata=res://*/MyEFModel.csdl|res://*/MyEFModel.ssdl|res://*/MyEFModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=EFUSERS;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"
Параметры provider и provider connection string задают как раз привычную нам строку подключения к БД.
Конструктор класса MyEFModelContainer можно вызвать также совсем без параметров, тогда по умолчанию строка подключения будет взята из App.config и станет равна той строке подключения, для которой собственно генерировался изначально DDL-скрипт.
В качестве аргумента конструктора класса MyEFModelContainer можно подать также экземпляр класса EntityConnection, который есть по сути объектная обертка вокруг строки подключения, мы не будет усложнять код, потому что конструктор класса MyEFModelContainer все равно сделает эту работу за нас.
После выполнения приведенного кода мы получим вот такие данные в таблицах:
Рассмотрим теперь алгоритм выборки данных из контейнера. Я для этих целей буду использовать язык встроенных запросов LINQ.Предположим, что некий пользователь вошел в систему, и нам нужно определить, имеет ли он право редактировать статьи. То есть мы должны по имени пользователя получить его группу и посмотреть, имеет ли эта группа соответствующее право.
Для этого мы выполним следующий код:
И получаем слегка укороченный SQL-запрос:
Я думаю, что на начальном этапе создания проекта, когда таблицы будут еще не слишком большими, подойдет и этот запрос, в дальнейшем же мы просто будем выносить все часто используемые не слишком оптимальные запросы в отдельные оптимизированные хранимые функции и процедуры. К счастью в Entity Framework 4 заложена возможность вызова хранимых процедур и функций, и не просто их вызова, а даже использования их в LINQ-запросах, что согласитесь очень хорошо.
Итак мы научились создавать модель данных, генерировать из нее схему данных, создавать сущности и делать из них выборку.
В следующей статье я планирую коснуться изменения (UPDATE) сущностей и изменения схемы данных (ALTER), создания и использования хранимых функций и процедур.
Entity Framework Tools предназначены для помощи в создании приложений Entity Framework (EF). Полная документация по Entity Framework: Обзор-EF 6.
Entity Framework Tools, описанные на этой странице, используются для создания EDMX -файлов, которые не поддерживаются в EF Core. Сведения о создании модели EF Core из существующей базы данных см. в разделе реконструирование — EF Core. Дополнительные сведения о различиях между EF 6 и EF Core см. в разделе Сравнение EF 6 и EF Core.
С помощью Entity Framework Tools можно создать концептуальную модель на основе существующей базы данных, а затем графически визуализировать и изменить концептуальную модель. Либо можно сначала создать концептуальную модель с помощью графических средств, а затем создать базу данных, которая поддерживает эту модель. В любом случае можно автоматически обновлять модель при изменении основной базы данных и автоматически создавать код объектного уровня для приложения. Процессы создания базы данных и создания кода объектного уровня допускают настройку.
Средства Entity Framework устанавливаются как часть рабочей нагрузки хранения и обработки данных в Visual Studio Installer. Их также можно установить как отдельный компонент в категории SDK, библиотеки и платформы .
Ниже приведены специальные средства, составляющие Entity Framework средства в Visual Studio.
С помощью EDM (модель данных с использованием сущностей) мастера можно создать концептуальную модель на основе существующей базы данных и добавить в приложение сведения о подключении к базе данных.
Сначала можно создать концептуальную модель с помощью мастера создания базы данных , а затем создать базу данных, которая поддерживает эту модель.
Мастер обновления моделей можно использовать для обновления концептуальной модели, модели хранения и сопоставлений при внесении изменений в основную базу данных.
начиная с Visual Studio 2010, средства Entity Framework не поддерживаются SQL Server 2000 .
Средства создают или изменяют EDMX файл. Этот EDMX файл содержит сведения, описывающие концептуальную модель, модель хранения и сопоставления между ними. Дополнительные сведения см. в разделе EDMX.
Entity Framework 6 Power Tools помогают создавать приложения, использующие EDM. Power Tools может создать концептуальную модель, проверить существующую модель, создать файлы исходного кода, содержащие классы объектов на основе концептуальной модели, и создать файлы исходного кода, содержащие представления, создаваемые моделью. Подробные сведения см. в разделе предварительно созданные представления сопоставления.
Генерация файла *.edmx
На консоль выводится список опций, которые можно указывать утилите для генерации необходимых файлов, основываясь на существующей базе данных; кроме того, доступны опции для генерации совершенно новой базы данных на основе имеющихся сущностных файлов. Ниже описаны некоторые общие опции EdmGen.exe:
/mode:FullGeneration
Генерировать файлы *.ssdl, *.msl, *.csdl и клиентские сущности из указанной базы данных
/project:
Базовое имя, которое должно использоваться для сгенерированного кода и файлов. Обычно это имя базы данных, из которой извлекается информация (допускается сокращенная форма — /р:)
/connectionstring:
Строка соединения, используемая для взаимодействия с базой данных (допускается сокращенная форма — /с:)
/language:
/pluralize
Позволяет автоматически выбирать множественное или единственное число для имени набора сущностей, имени типа сущности и имени навигационного свойства, согласно правилам английского языка
Как и платформа .NET 4.0 в целом, программная модель EF поддерживает программирование в стиле сначала домен, что позволяет создавать свойства (с применением типичных объектно-ориентированных приемов) и использовать их для генерации новой базы данных. В этом вводном обзоре ADO.NET EF ни подход "сначала модель", ни генерация сущностной модели клиентской стороны с помощью утилиты EdmGen.exe применяться не будут. Вместо этого будут использоваться визуальные конструкторы EDM из среды Visual Studio 2010.
Щелчок на кнопке Add (Добавить) приводит к запуску мастера создания модели сущностных данных (Entity Data Model Wizard). На первом шаге мастер позволяет выбрать, нужно генерировать EDM из существующей базы данных либо определить пустую модель (для разработки в стиле "сначала модель"). Выберите опцию Generate from database (Генерировать из базы данных) и щелкните на кнопке Next (Далее).
На втором шаге мастера выбирается база данных. Если соединение с базой данных внутри проводника сервера Visual Studio 2010 уже существует, оно будет присутствовать в раскрывающемся списке. Если же нет, щелкните на кнопке New Connection (Создать соединение). В любом случае выберите базу данных AutoLot и отметьте флажок Save entity connection settings in App.config as (Сохранить настройки соединения в файле App.config как):
Прежде чем щелкать на кнопке Next, взгляните на формат строки соединения:
Основной интерес в ней представляет флаг metadata, который используется для указания имен встроенных данных XML-ресурсов концептуального, физического и файла отображений (вспомните, что во время компиляции файл *.edmx будет разделен на отдельные файлы, и данные этих файлов примут вид двоичных ресурсов, встраиваемых в сборку).
На последнем шаге мастера можно выбрать элементы из базы данных, для которой необходимо сгенерировать модель EDM. В рассматриваемом примере ограничимся только таблицей Inventory. Щелкните на кнопке Finish для генерации модели EDM.
Изменение формы сущностных данных
После завершения работы с мастером откроется визуальный конструктор EDM в IDE-среде с одной сущностью по имени Inventory. Просмотреть композицию любой сущности в визуальном конструкторе можно в окне Model Browser (Браузер моделей), которое открывается через пункт меню View --> Other Windows (Вид --> Другие окна).
Теперь взгляните на формат концептуальной модели для таблицы базы данных Inventory, представленный в папке Entity Types (Типы сущности). В узле хранилища, имя которого совпадает с именем базы данных (AutoLotModel.Store), находится физическая модель базы данных:
По умолчанию имена сущностей будут основаны на именах исходных объектов баз данных; однако, вспомните, что имена сущностей в концептуальной модели могут быть любыми. Чтобы изменить имя сущности либо имена свойств сущности, необходимо выбрать нужный элемент в визуальном конструкторе и установить соответствующим образом свойство Name в окне свойств (Properties). Переименуйте сущность Inventory в Car и свойство PetName в CarNickname:
Теперь выберите сущность Car в визуальном конструкторе и снова загляните в окно Properties. Вы должны увидеть поле Entity Set Name (Имя набора сущностей), также переименованное из Inventories в Cars. Значение Entity Set Name важно, потому что оно соответствует имени свойства в классе контекста данных, который используется для модификации базы данных. Вспомните, что это свойство инкапсулирует переменную-член ObjectSet<T> класса-наследника ObjectContext.
Прежде чем двигаться дальше, скомпилируйте приложение; это приведет к обновлению кодовой базы и генерации файлов *.csdl, *.msl и *.ssdl на основе данных файла *.edmx.
Просмотр отображений
Имея данные в измененной форме, можно просматривать отображения между концептуальным уровнем и физическим уровнем в окне Mapping Details (Сведения об отображениях), которое открывается через пункт меню View --> Other Windows --> Mapping Details. Взгляните на рисунок ниже и обратите внимание, что узлы в левой части дерева представляют имена данных из физического уровня, в то время как узлы справа представляют имена концептуальной модели:
Просмотр данных сгенерированного файла *.edmx
Теперь давайте посмотрим, что именно мастер EDM Wizard сгенерировал. Щелкните правой кнопкой мыши на файле InventoryEDM.edmx в проводнике решения и выберите в контекстном меню пункт Open With. (Открыть с помощью). В открывшемся диалоговом окне выберите опцию XML Editor (Редактор XML). Это позволит просмотреть XML-данные, лежащие в основе представления в визуальном конструкторе EDM. Структура этого XML-документа разделена на четыре части: все они находятся в корневом элементе <edms:Edmx>.
Подэлемент <edmx:Runtime> определяет XML-данные для концептуальной, физической и модели уровня отображения. Ниже показано определение физической таблицы базы данных Inventory:
Следующая важная часть файла *.edmx — элемент <edmx:ConceptualModels>. который определяет измененные сущности клиентской стороны. Как видно, сущность Cars определяет свойство CarNickname, которое изменяется в визуальном конструкторе:
Это перемещает на уровень отображения, который окно Mapping Details и исполняющая среда EF используют для подключения имен в концептуальной модели к физической модели:
Последней частью файла *.edmx является элемент <Designer>. который исполняющей средой EF не используется. Он содержит инструкции, используемые Visual Studio для отображения сущностей на поверхности визуального конструктора.
Удостоверьтесь, что проект скомпилирован, по крайней мере, однажды, и щелкните на кнопке Show All Files (Показать все файлы) в проводнике решений. Затем зайдите в папку obj\Debug, а после этого — в edmxResourcesToEmbed. Здесь находятся три XML-файла, основанные на содержимом файла *.edmx:
После загрузки EF6 с помощью nuget и попытки запустить мой проект, он возвращает следующую ошибку:
Я только что попал в ту же проблему, и это выглядит как EntityFramework, хотя установленный из диспетчера пакетов NuGet не был правильно установлен в проекте.
PMC написал, что EntityFramework 6.0.1 уже установлен, но добавил его в мое консольное приложение (которое по закону НЕ использует EF), но у меня тоже получилось. Я удаляю EF из ссылок на консольные приложения, возвращаю ошибки, я не понимаю - мое консольное приложение использует проект репозитория (который использует EF) Спасибо за помощь! Не забудьте добавить -ProjectName <ProjectName> в командную строку, если у вас есть несколько проектов в вашем решении . . Используя -Pre опцию скажите nuget, чтобы установить пререлизные пакеты. Я не рекомендую использовать это. У меня похожая ошибка, но решение было просто установить EntityFramework в хост-проекте. Я установил его в библиотеке классов, но не в главном проекте (web / console / или где-либо еще), Та же проблема здесь. У меня был проект, в котором не было ссылки на EF, но DLL EF была в папке Debug. Выполнение этой команды для этого проекта добавлено EntityFramework.SqlServer.dll в папку Debug - проблема решена. В моей ситуации эта ошибка не появлялась, пока я не развернул проект на нашем тестовом сервере. На самом деле это был EntityFramework.SqlServer.dll, который отсутствовал, и установка EF через менеджер пакетов работала. Он просто добавил две соответствующие ссылки на проект, а затем добавил настройки entityFramework в web.config. Я полагаю, что локальный IIS мог получать сборку локально, но полный IIS на веб-сервере не мог из-за разрешений?Вы добавили EF в проект библиотеки классов. Вам также нужно добавить его в проект, который ссылается на него (ваше консольное приложение, веб-сайт или что-то еще).
Это абсолютно нелепый ответ. С какой стати мне это нужно делать? А знаете что еще смешнее? Оно работает. Смотрите мой ответ ниже, вам не нужно устанавливать EF в консольном приложении. Вы ответите правильно. Только добавьте ссылку EntityFramework.SqlServer.dll в интерфейсный проект, который использует библиотеку с EF, исправьте проблему. Так что не используйте этот EF (только DLL) Я подозреваю, что причина, по которой EntityFramework.SqlServer.dll не определяется как зависимость, заключается в том, что Entity Framework загружает его динамически. Как ваш проект должен знать, чтобы скопировать SQL-провайдера, когда единственная ссылка на него находится в файле конфигурации?Вам не нужно устанавливать Entity Framework в вашем консольном приложении, вам просто нужно добавить ссылку на сборку EntityFramework.SqlServer.dll. Вы можете скопировать эту сборку из проекта библиотеки классов, который использует Entity Framework, в папку LIB и добавить ссылку на нее.
- Приложение библиотеки классов:
- Установить Entity Framework
- Напишите свой код слоя данных
- Файл app.config имеет всю конфигурацию, связанную с Entity Framework, кроме строки подключения.
- Добавьте ссылку на первый проект.
- Добавьте ссылку на EntityFramework.SqlServer.dll.
- app.config / web.config содержит строку подключения (помните, что имя записи конфигурации должно совпадать с именем класса DbContext.
Я надеюсь, что это помогает.
Правильный ответ. Нет необходимости устанавливать EF. EntityFramework.SqlServer.dll. Я должен согласиться. Это полностью правильный ответ. Ссылайтесь на dll размером 1/2 мб или потяните проект EF nuget, который составляет> 5,5 мб Немного снижает стоимость создания многоуровневых систем. Плохое шоу от MS: у меня 4 уровня, и у моего высшего уровня не должно быть оснований ничего знать об EF Все равно смешно в любом случае. Например, зачем интерфейсу нужна ссылка на SqlServer? Передний конец не заботился бы меньше, в моем случае. Но это работает. +1 Не затруднит ли это обновление версий EntityFramework? Вы должны были бы не забыть пойти и обновить ссылку на DLLПохоже, это недавно добавленный файл в EF6. Первоначально я не включил его в свой модуль слияния и столкнулся с проблемой, перечисленной здесь.
Я столкнулся с этой проблемой, когда у меня ранее был проект (а) со ссылкой на проект (б), который имел ссылку на EF. После очистки и удаления папки bin проекта (a), а затем перестройки, попалась ссылка EF, но не EF.SqlServer.dll. Копирование этого вручную сработало для меня @dan richardson спасибо за упоминание «удалить папку bin». Я получил ошибку при попытке запустить скрипт LINQPad после обновления EF6. Даже ссылка на EntityFramework.SqlServer.dll в LINQPad не исправила его, пока я не перестроил свое решение в VS2013. Затем новая ссылка была правильно разрешена в LINQPad, и мой скрипт запустился! В моем случае я был в порядке в среде разработки, но когда я опубликовал, появляется упомянутая проблема. После сравнения списка библиотек в dev с папкой bin на сервере я заметил, что EntityFramework.SqlServer.dll отсутствует, я просто загружаю его, обновляю приложение и вуаля исправляю. Это была проблема для меня, спасибо! Посмотрите чистое решение @Anders, чтобы избежать проблем, забыв включить DLL в каждый необходимый проект.Вместо добавления EntityFramework.SqlServer в хост-проект, вы можете обеспечить статическую ссылку на него из вашего проекта Model / entity, подобного этому
Это сделает процесс сборки включающим сборку с хост-проектом.
Я думаю, что это хорошее чистое решение, в котором нам не нужно включать ссылки на связанные с постоянством библиотеки DLL в проекты, которые должны быть независимыми от устойчивости. Согласен, и это относится к любой библиотеке с неявными зависимостями, а не только с постоянством Если у вас есть явная зависимость от типа в сборке, он будет скопирован процессом сборки. Однако здесь у вас нет явной зависимости, и процесс сборки не сможет скопировать сборку в папку сборки. Мой код просто убедился, что в указанной сборке существует явная ссылка на любой тип. Без этого не будет явной зависимости сборки от вашего кода, и она не будет скопирована в выводПри установке Entity Framework 6 через Nuget . EntityFramework.SqlServer иногда пропускает другой исполняемый файл. Просто добавьте Nuget пакет в этот проект.
Иногда выше не работает для тестового проекта
Чтобы решить эту проблему в тестовом проекте, просто поместите этот метод в тестовый проект:
Этот метод никогда не вызывался, но, по моим наблюдениям, компилятор удалит все «ненужные» сборки и без использования EntityFramework.SqlServer материала тест не пройден.
Ну, это не красиво, но это решило проблему, с которой я столкнулся в своем тестовом проекте. Ни одно из других решений не сработало. В моем случае было достаточно добавить Entity Framework также в мой тестовый проект в разделе «Управление пакетами Nuget для решения» на самом деле вам нужно поместить в любой проект (не только тест), чтобы убедиться, что System.Data.Entity.SqlServer будет включен в «набор результатов библиотеки» после компиляции (примечание: Unity или другой инструмент IoC могут изменить это правило, и вы будете нужно вызвать этот код из тестового проекта). На самом деле это лучшее решение, потому что вам не нужно распространять ссылки на структуры сущностей повсюду в вашем проекте. Это указало мне в правильном направлении. Объект EntityFramework.SqlServer добавляется в вашу библиотеку классов, но если он не используется, он не будет помещен в выходную папку вашего приложения. Я исправил проблему, добавив an ExecutionStrategy , что мне еще нужно было сделать, поэтому добавление строки, как SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy()); внутри DbConfiguration класса, решило проблему.Добавить эту функцию
в контекстный класс базы данных в классе библиотеки и отсутствующая DLL EntityFramework.SqlServer.dll будет скопирована в правильные места.
извините, пытаясь отозвать его . поскольку я не думал, что это сработает . и это делает! . он говорит, что я не могу изменить свой голос, если ответ не отредактирован, потому что это было слишком долго и с тех пор было заблокирован . Это сработало и для меня. У нас есть проект библиотеки, который использует EF 6, и консольное приложение, которое использует библиотеку. Мы получили то же исключение, что и ОП. Мы не хотим помещать специфичную для EntityFramework конфигурацию в файл конфигурации приложения, поэтому этот метод работал для нас. Спасибо Куда ты звонишь FixEfProviderServicesProblem я пробовал в конструкторе, не повезло.Ничто из этого не помогло мне. Я нашел решение в другом вопросе stackoverflow . Я добавлю это здесь для удобства:
Эта! Нет необходимости добавлять ссылку на другие проекты, которые могут ссылаться на эту сборку.Вам нужно сделать ссылку, чтобы она была скопирована в путь приложения den. Потому что позже на него будут ссылаться во время выполнения. Таким образом, вам не нужно копировать какие-либо файлы.
Я получил ту же ошибку при использовании Entity Framework 6 с SQL Server Compact 4.0. Статья о MSDN для провайдеров Entity Framework для EF6 оказалась полезной. Выполнение соответствующих команд провайдера в виде пакетов nuget на консоли диспетчера пакетов может решить проблему, так как пакеты NuGet автоматически добавят регистрации в файл конфигурации. Я побежал, PM> Install-Package EntityFramework.SqlServerCompact чтобы решить проблему.
просто спасатель. Он должен быть помечен как ответ, так как он четко дает решение проблемыСегодня столкнулся с этой проблемой при работе с набором веб-сервисов, каждый в разных проектах, и отдельным проектом, содержащим интеграционные тесты для некоторых из этих сервисов.
Я использовал эту настройку в течение некоторого времени с EF5, без необходимости включать ссылки на EF из Интеграционного тестового проекта.
Теперь, после обновления до EF6, мне кажется, что мне нужно включить ссылку на EF6 в проект интеграционного тестирования, даже если он там не используется (в значительной степени, как указано выше пользователем 3004275 ).
Признаки того, что вы столкнулись с той же проблемой:
- Вызовы непосредственно в EF (подключение к БД, получение данных и т. Д.) Работают нормально, если они инициируются из проекта, который имеет ссылки на EF6.
- Звонки в сервис через опубликованный интерфейс сервиса работают нормально; т.е. в сервисе отсутствуют пропущенные ссылки "внутри".
- Вызовы напрямую к открытым методам в сервисном проекте, из проекта вне сервиса, вызовут эту ошибку, даже если EF не используется в этом проекте; только внутри в вызываемом проекте
Третий момент - это то, что меня оттолкнуло на некоторое время, и я до сих пор не уверен, зачем это нужно. Добавление ссылки на EF6 в моем проекте Integration Test решило это в любом случае .
Драйверы доступа к базам MS SQL Server
Драйверы объектно-реляционного сопоставления возвращают данные таблиц базы данных в виде экземпляров классов и их свойств. Примером драйверов объектно-ориентированного доступа к базам данных являются Entity Framework и Entity Framework Core.
База данных исходника
Получение данных из базы MS SQL
- Подготовка подключения к базе. Выбор способа подключения и создание строки подключения.
- Создание команды получения или обновления данных. SQL команды (запросы) создаются посредством объектов класса SQLCommand.
- Подключение к базе данных и выполнение команд (SQL запросов). Подключение происходит через объект SQLConnection.
- Получение данных. Если выполняется команда SELECT, то ожидается возврат данных в виде таблиц. Получить данные помогают объекты классов SQLDataAdapter и SQLDataReader.
Примеры строк подключения к MS SQL Server
Формирование подключения начинается с создания строки подключения. Строка подключения для SQL представляет собой входную текстовую информацию с указанием имени сервера, названия базы данных, способа проверки подлинности, идентификационные данные пользователя и некоторую служебную информацию.
Подключение к SQL Server
Соединение с базой данных MS SQL Server происходит при помощи экземпляра класса SQLConnection. Завершая сеанс связи с сервером баз данных необходимо явно закрывать соединение вызывая методы Close() или Dispose() .
Объект SqlConnection выходя за пределы области видимости не закрывается самостоятельно. Для гарантированного автоматического закрытия соединения рекомендуется использовать оператор using .
Листинг метода подключения и выполнения запросов к базе данных:
Строка подключения к MS SQL Server создана с помощью построителя, объекта класса SqlConnectionStringBuilder входящего в состав пространства имён Microsoft.Data.SqlClient. Таким способом создаётся синтактически правильная строка подключения к серверу базы данных. Подробнее о создании строки подключения к серверу баз данных можно прочитать в статье о взаимодействии с базой данных через модуль Entity Framework Core.
Объединение подключений - Pooling
Процесс подключения к SQL серверу состоит из нескольких последовательных шагов (установка сетевого соединения, анализ строки подключения, проверка идентификационных данных и др.), каждый из которых занимает некоторое время. При выполнении большого количества запросов к серверу базы данных, общее увеличение времени подключения перед запросами становится заметным и отражается на производительности веб приложения.
Например: "Data Source=PAVEL\SQLEXPRESS_2016;Initial Catalog=DBMSSQL;Integrated Security=True;Pooling=False"
Pooling - сравнение производительности
Для сравнения скорости обработки SQL запросов создадим два одинаковых кода запросов, с оптимизацией подключений и без неё. Две строки запроса к базе: в первой получение данных из одной таблицы, во второй одновременное выполнение сложной команды чтения данных. Для повышения точности измерения каждая команда повторяется установленное количество раз.
Одиночная команда, запрос к одной таблице: строка команды = "SELECT * FROM Sciences";
Сложная команда, запрос данных в одной строке из нескольких таблиц: строка команды = ("SELECT * FROM Sciences;SELECT * FROM Sections;SELECT * FROM SubSections; . . . SELECT * FROM TableN");
Программный код множественных запросов к базе данных с созданием пулов и без использования оптимизации:
Быстродействие SQLDataReader
Сравнительный тест быстродействия двух вариантов команд с включенным и отключенным пулингом соединений. В первом варианте выполняется команда запроса к одной таблице с повтором 100 раз. Во втором варианте выполняется команда запроса данных у 30 таблиц одновременно, также с повтором 100 раз.
Первое подключение к базе данных:
При первом соединении с базой данных одиночная команда с пулингом выполняется почти в 2 раза дольше, чем с отключёнными пулами. Сложные команды выполняются практически одинаковое время. Логично предположить, что дополнительное время затрачивается на создание пула.Быстродействие SQLDataAdapter
Первое подключение к базе данных:
Первое чтение из базы данных с помощью SQLDataAdapter происходит практически аналогично ситуации с SQLDataReader. Но комплексные команды, при включенном пулинге выполняются гораздо быстрее.Последующие запросы к базе данных:
Последующие запросы одиночных команды выполняются почти в 14 раз быстрее при использовании пулов подключений. Сложные запросы выполняются также чувствительно быстрее с пулингом: в 2,6 раз быстрее подключений без оптимизации. Можно отметить, что SQLDataAdapter обеспечивает гораздо большую скорость выполнения запросов по сравнению с функциональностью SQLDataReader.Читайте также: