Как добавить базу данных в visual studio wpf
The scenario in this tutorial is currently blocked due to an issue with Visual Studio 2022 that is scheduled to be fixed in a future update. It should work with Visual Studio 2019 or earlier.
This article focuses on using data tools in Visual Studio, and does not attempt to explain the underlying technologies in any depth. It assumes that you have a basic familiarity with XAML, Entity Framework, and SQL. This example also does not demonstrate Model-View-ViewModel (MVVM) architecture, which is standard for WPF applications. However, you can copy this code into your own MVVM application with few modifications.
Install and connect to Northwind
Install the Northwind sample database by following these steps:
In Visual Studio, open the SQL Server Object Explorer window. (SQL Server Object Explorer is installed as part of the Data storage and processing workload in the Visual Studio Installer.) Expand the SQL Server node. Right-click on your LocalDB instance and select New Query.
A query editor window opens.
Copy the Northwind Transact-SQL script to your clipboard. This T-SQL script creates the Northwind database from scratch and populates it with data.
Paste the T-SQL script into the query editor, and then choose the Execute button.
After a short time, the query finishes running and the Northwind database is created.
Configure the project
Add the NuGet package for Entity Framework 6. In Solution Explorer, select the project node. In the main menu, choose Project > Manage NuGet Packages.
In the NuGet Package Manager, click on the Browse link. Entity Framework is probably the top package in the list. Click Install in the right pane and follow the prompts. The Output window tells you when the install is finished.
Now you can use Visual Studio to create a model based on the Northwind database.
Create the model
Call the model Northwind_model and choose OK. The Entity Data Model Wizard opens. Choose EF Designer from database and then click Next.
In the next screen, enter or choose your LocalDB Northwind connection (for example, (localdb)\MSSQLLocalDB), specify the Northwind database, and click Next.
In the next page of the wizard, choose which tables, stored procedures, and other database objects to include in the Entity Framework model. Expand the dbo node in the tree view and choose Customers, Orders, and Order Details. Leave the defaults checked and click Finish.
The designer surface for the .edmx file enables you to modify some properties and relationships in the model. We are not going to use the designer in this walkthrough.
The .tt files are general purpose and you need to tweak one of them to work with WPF databinding, which requires ObservableCollections. In Solution Explorer, expand the Northwind_model node until you find Northwind_model.tt. (Make sure you are not in the .Context.tt file, which is directly below the .edmx file.)
Replace the two occurrences of ICollection with ObservableCollection .
Press F5 or Ctrl+F5 to build and run the project. When the application first runs, the model classes are visible to the data sources wizard.
Now you are ready to hook up this model to the XAML page so that you can view, navigate, and modify the data.
Databind the model to the XAML page
It is possible to write your own databinding code, but it is much easier to let Visual Studio do it for you.
From the main menu, choose Project > Add new data source to bring up the Data Source Configuration Wizard. Choose Object because you are binding to the model classes, not to the database:
Expand the node for your project, and select Customer. (Sources for Orders are automatically generated from the Orders navigation property in Customer.)
Click Finish.
Navigate to MainWindow.xaml in Code View. We're keeping the XAML simple for the purposes of this example. Change the title of MainWindow to something more descriptive, and increase its Height and Width to 600 x 800 for now. You can always change it later. Now add these three row definitions to the main grid, one row for the navigation buttons, one for the customer's details, and one for the grid that shows their orders:
Now open MainWindow.xaml so that you're viewing it in the designer. This causes the Data Sources window to appear as an option in the Visual Studio window margin next to the Toolbox. Click on the tab to open the window, or else press Shift+Alt+D or choose View > Other Windows > Data Sources. We are going to display each property in the Customers class in its own individual text box. First, click on the arrow in the Customers combo box and choose Details. Then, drag the node onto the middle part of the design surface so that the designer knows you want it to go in the middle row. If you misplace it, you can specify the row manually later in the XAML. By default, the controls are placed vertically in a grid element, but at this point, you can arrange them however you like on the form. For example, it might make sense to put the Name text box on top, above the address. The sample application for this article reorders the fields and rearranges them into two columns.
In the code view, you can now see a new Grid element in row 1 (the middle row) of the parent Grid. The parent Grid has a DataContext attribute that refers to a CollectionViewSource that's been added to the Windows.Resources element. Given that data context, when the first text box binds to Address, that name is mapped to the Address property in the current Customer object in the CollectionViewSource.
When a customer is visible in the top half of the window, you want to see their orders in the bottom half. You show the orders in a single grid view control. For master-detail databinding to work as expected, it is important that you bind to the Orders property in the Customers class, not to the separate Orders node. Drag the Orders property of the Customers class to the lower half of the form, so that the designer puts it in row 2:
Visual Studio has generated all the binding code that connects the UI controls to events in the model. All you need to do, in order to see some data, is to write some code to populate the model. First, navigate to MainWindow.xaml.cs and add a data member to the MainWindow class for the data context. This object, which has been generated for you, acts something like a control that tracks changes and events in the model. You'll also add CollectionViewSource data members for customers and orders, and the associated constructor initialization logic. The top of the class should look like this:
Add a using directive for System.Data.Entity to bring the Load extension method into scope:
Now, scroll down and find the Window_Loaded event handler. Notice that Visual Studio has added a CollectionViewSource object. This represents the NorthwindEntities object that you selected when you created the model. You added that already, so you don't need it here. Let's replace the code in Window_Loaded so that the method now looks like this:
Press F5. You should see the details for the first customer that was retrieved into the CollectionViewSource. You should also see their orders in the data grid. The formatting isn't great, so let's fix that up. You can also create a way to view the other records and do basic CRUD operations.
Adjust the page design and add grids for new customers and orders
The default arrangement produced by Visual Studio is not ideal for your application, so we'll provide the final XAML here to copy into your code. You also need some "forms" (which are actually Grids) to enable the user to add a new customer or order. In order to be able to add a new customer and order, you need a separate set of text boxes that are not data-bound to the CollectionViewSource . You'll control which grid the user sees at any given time by setting the Visible property in the handler methods. Finally, you add a Delete button to each row in the Orders grid to enable the user to delete an individual order.
First, add these styles to the Windows.Resources element in MainWindow.xaml:
Next, replace the entire outer Grid with this markup:
Add buttons to navigate, add, update, and delete
In Windows Forms applications, you get a BindingNavigator object with buttons for navigating through rows in a database and doing basic CRUD operations. WPF does not provide a BindingNavigator, but it is easy enough to create one. You do that with buttons inside a horizontal StackPanel, and associate the buttons with Commands that are bound to methods in the code behind.
There are four parts to the command logic: (1) the commands, (2) the bindings, (3) the buttons, and (4) the command handlers in the code-behind.
Add commands, bindings, and buttons in XAML
First, add the commands in the MainWindow.xaml file inside the Windows.Resources element:
A CommandBinding maps a RoutedUICommand event to a method in the code behind. Add this CommandBindings element after the Windows.Resources closing tag:
Now, add the StackPanel with the navigation, add, delete, and update buttons. First, add this style to Windows.Resources :
Second, paste this code just after the RowDefinitions for the outer Grid element, toward the top of the XAML page:
Add command handlers to the MainWindow class
The code-behind is minimal except for the add and delete methods. Navigation is performed by calling methods on the View property of the CollectionViewSource. The DeleteOrderCommandHandler shows how to perform a cascade delete on an order. We have to first delete the Order_Details that are associated with it. The UpdateCommandHandler adds a new customer or order to the collection, or else just updates an existing customer or order with the changes that the user made in the text boxes.
Add these handler methods to the MainWindow class in MainWindow.xaml.cs. If your CollectionViewSource for the Customers table has a different name, then you need to adjust the name in each of these methods:
Run the application
To start debugging, press F5. You should see customer and order data populated in the grid, and the navigation buttons should work as expected. Click on Commit to add a new customer or order to the model after you have entered the data. Click on Cancel to back out of a new customer or new order form without saving the data. You can make edits to existing customers and orders directly in the text boxes, and those changes are written to the model automatically.
Предварительные требования
Для выполнения этого пошагового руководства требуются следующие компоненты:
Доступ к запущенному экземпляру SQL Server или SQL Server Express с подключенной учебной базой данных AdventureWorks. Базу данных AdventureWorks можно загрузить из GitHub.
Создание новых классов сущностей
В обозревателе решений щелкните проект правой кнопкой мыши, выберите сначала Добавить, а затем Новый элемент.
Откроется диалоговое окно Добавить новый элемент.
Назовите файл AdventureWorksModel.edmx , а затем щелкните Добавить.
Появится мастер модели EDM.
На экране «Выбор содержимого модели» выберите Конструктор EF из базы данных, а затем нажмите кнопку Далее.
На экране «Выбор подключения к данным» укажите подключение к базе данных AdventureWorksLT2008. Дополнительные сведения см. в статье Диалоговое окно «Выбор подключения к данным».
Проверьте, чтобы имя было AdventureWorksLT2008Entities и чтобы был установлен флажок у параметра Сохранить параметры соединения сущности в App.Config как:, после чего нажмите Далее.
На экране «Выбор объектов базы данных» разверните узел «Таблицы» и выберите таблицы Product и ProductCategory.
Вы можете создавать классы сущностей для всех таблиц; однако в этом примере данные извлекаются только из этих двух таблиц.
Сущности Product и ProductCategory отображаются в конструкторе сущностей.
Получение и представление данных
Откройте файл MainWindow.xaml.
Задайте для свойства Width элемента Window значение 450.
В редакторе XAML добавьте следующий тег DataGrid между тегами
С помощью меню свойств окна или редактора XAML создайте для элемента Window с именем Window_Loaded обработчик событий для события Loaded. Дополнительные сведения см. в разделе Практическое руководство. Создание простого обработчика событий.
Ниже показан код XAML для файла MainWindow.xaml.
Если используется Visual Basic, в первой строке MainWindow.xaml замените x:Class="DataGridSQLExample.MainWindow" на x:Class="MainWindow" .
Откройте файл кода программной части (MainWindow.xaml.vb или MainWindow.xaml.cs) для элемента Window.
Добавьте следующий код, чтобы получать только определенные значения из объединенных таблиц, и назначьте свойство ItemsSource элемента DataGridдля результатов запроса.
эта статья посвящена использованию средств данных в Visual Studio и не пытается объяснить основные технологии в любой глубине. Предполагается, что у вас есть базовые знания XAML, Entity Framework и SQL. В этом примере также не демонстрируется Архитектура Model-View-ViewModel (MVVM), которая является стандартом для приложений WPF. Однако этот код можно скопировать в собственное приложение MVVM с небольшими изменениями.
Установка и подключение к Northwind
Установите учебную базу данных Northwind, выполнив следующие действия.
в Visual Studio откройте окно SQL Server обозреватель объектов . (SQL Server обозреватель объектов устанавливается как часть рабочей нагрузки хранения и обработки данных в Visual Studio Installer.) разверните узел SQL Server . щелкните правой кнопкой мыши экземпляр LocalDB и выберите создать запрос.
Откроется окно редактора запросов.
скопируйте скрипт Transact-SQL Northwind в буфер обмена. этот сценарий T-SQL создает базу данных Northwind с нуля и заполняет ее данными.
вставьте скрипт T-SQL в редактор запросов, а затем нажмите кнопку выполнить .
По истечении короткого времени выполнение запроса завершается и создается база данных Northwind.
Настройка проекта
добавьте пакет NuGet для Entity Framework 6. в Обозреватель решений выберите узел проекта. в главном меню выберите Project > управление пакетами NuGet.
теперь можно использовать Visual Studio для создания модели на основе базы данных Northwind.
Создание модели
Вызовите модель Northwind_model и нажмите кнопку ОК. Откроется мастер EDM . Выберите элемент конструктор EF из базы данных , а затем нажмите кнопку Далее.
на следующем экране введите или выберите подключение LocalDB Northwind (например, (LocalDB) \MSSQLLocalDB), укажите базу данных northwind и нажмите кнопку далее.
На следующей странице мастера выберите таблицы, хранимые процедуры и другие объекты базы данных для включения в модель Entity Framework. Разверните узел dbo в представлении в виде дерева и выберите Customers, Orders и Order Details. Оставьте установленными значения по умолчанию и нажмите кнопку Готово.
Область конструктора для файла EDMX позволяет изменять некоторые свойства и связи в модели. Мы не будем использовать конструктор в этом пошаговом руководстве.
Файлы . TT являются общим целям и необходимо настроить один из них для работы с DataBinding WPF, что требует обсерваблеколлектионс. в Обозреватель решений разверните узел Northwind_model, пока не найдете Northwind_model. tt. (Убедитесь, что вы не используете файл . Context.TT , который находится непосредственно под EDMX -файлом.)
Нажмите клавишу F5 или CTRL + F5 , чтобы построить и запустить проект. При первом запуске приложения классы модели видимы в мастере источников данных.
Теперь все готово для подключения этой модели к XAML-странице, чтобы можно было просматривать, перемещать и изменять данные.
Привязка модели к странице XAML
можно написать собственный код привязки данных, но гораздо проще позволить Visual Studio сделать это за вас.
в главном меню выберите Project > добавить новый источник данных , чтобы открыть мастер настройки источника данных. Выберите объект , так как вы привязываетесь к классам модели, а не к базе данных:
Разверните узел проекта и выберите Customer (клиент). (Источники для заказов автоматически формируются из свойства навигации Orders в Customer.)
Перейдите к файлу MainWindow. XAML в представлении кода. Мы постоянно используем XAML для целей этого примера. Измените заголовок MainWindow на что-то более описательное и увеличьте его высоту и ширину до 600 x 800. Вы всегда можете изменить его позже. Теперь добавьте эти три определения строк в главную сетку, одну строку для кнопок навигации, одну для сведений клиента и одну для сетки, которая показывает их заказы:
Теперь откройте файл MainWindow. XAML , чтобы просмотреть его в конструкторе. в результате окно источники данных будет отображаться как параметр в Visual Studio поле окна рядом с областью элементов. щелкните вкладку, чтобы открыть окно, или нажмите клавиши Shift + Alt + D или выберите просмотреть > другие Windows > источники данных. Мы будем отображать каждое свойство в классе Customers в отдельном текстовом поле. Сначала щелкните стрелку в поле со списком Клиенты и выберите сведения. Затем перетащите узел в среднюю часть области конструктора, чтобы разработчик знал, что он должен находиться в средней строке. В случае его невозможности вручную указать строку в XAML. По умолчанию элементы управления размещаются вертикально в элементе Grid, но на этом этапе их можно расположить в форме. Например, может иметь смысл разместить текстовое поле Name сверху, над адресом. Пример приложения для этой статьи переупорядочивает поля и перемещает их в два столбца.
В представлении кода теперь можно увидеть новый Grid элемент в строке 1 (средняя строка) родительской сетки. Родительская сетка имеет DataContext атрибут, который ссылается на CollectionViewSource, добавленный в Windows.Resources элемент. Учитывая этот контекст данных, при привязке первого текстового поля к адресу это имя сопоставляется Address со свойством в текущем Customer объекте в CollectionViewSource.
Когда клиент отображается в верхней половине окна, необходимо просмотреть заказы в нижней половине. Заказы отображаются в одном элементе управления представления сетки. Для работы привязки "основной — подробности" необходимо выполнить привязку к свойству Orders в классе Customers, а не к отдельному узлу Orders. Перетащите свойство Orders класса Customers в нижнюю половину формы, чтобы конструктор поместит его в строку 2:
Visual Studio создала весь код привязки, который подключает элементы управления пользовательского интерфейса к событиям в модели. Для того чтобы увидеть некоторые данные, необходимо написать код для заполнения модели. Сначала перейдите к файлу MainWindow. XAML. CS и добавьте член данных в класс MainWindow для контекста данных. Этот объект, который был создан для вас, действует примерно так же, как элемент управления, отслеживающий изменения и события в модели. Вы также добавите элементы данных CollectionViewSource для клиентов и заказов, а также связанную логику инициализации конструктора. Начало класса должно выглядеть следующим образом:
using Добавьте директиву для System. Data. Entity, чтобы перевести метод расширения нагрузки в область:
Теперь прокрутите вниз и найдите Window_Loaded обработчик событий. обратите внимание, что Visual Studio добавил объект CollectionViewSource. Представляет объект Норсвиндентитиес, выбранный при создании модели. Вы уже добавили это, так что вам это не нужно. Выполним замену кода в Window_Loaded , чтобы метод теперь выглядел следующим образом:
Нажмите клавишу F5. Вы должны увидеть сведения для первого клиента, полученного в CollectionViewSource. Их заказы также должны отображаться в сетке данных. Форматирование не имеет ничего хорошего, так что давайте исправляется. Можно также создать способ просмотра других записей и выполнения базовых операций CRUD.
Настройка макета страницы и добавление сеток для новых клиентов и заказов
расположение по умолчанию, созданное Visual Studio, не идеально подходит для вашего приложения, поэтому мы предоставим конечный XAML-код, чтобы скопировать его в свой исходный текст. Также требуются некоторые «формы» (которые являются сетками), чтобы пользователь мог добавить нового клиента или заказ. Чтобы добавить нового клиента и заказ, необходим отдельный набор текстовых полей, не привязанных к CollectionViewSource данным. Вы можете указать, какую сетку пользователь видит в любой момент, установив свойство Visible в методах обработчика. Наконец, вы добавите кнопку Удалить в каждую строку сетки заказы, чтобы позволить пользователю удалить отдельный заказ.
Сначала добавьте эти стили в Windows.Resources элемент в файле MainWindow. XAML:
Затем замените всю внешнюю сетку этой разметкой:
Добавление кнопок для навигации, добавления, обновления и удаления
в Windows Forms приложениях вы получаете объект BindingNavigator с кнопками для навигации по строкам в базе данных и выполнения базовых операций CRUD. WPF не предоставляет BindingNavigator, но достаточно просто создать его. Это можно сделать с помощью кнопок в горизонтальном StackPanel и связать кнопки с командами, привязанными к методам в коде программной части.
Логика команды состоит из четырех частей: (1) команды, (2) привязки, (3) кнопки и (4) обработчики команд в коде программной части.
Добавление команд, привязок и кнопок в XAML
Сначала добавьте команды в файл MainWindow. XAML внутри Windows.Resources элемента:
CommandBinding сопоставляет RoutedUICommand событие с методом в коде программной части. Добавьте этот CommandBindings элемент после Windows.Resources закрывающего тега:
Теперь добавьте StackPanel с помощью кнопок навигации, добавления, удаления и обновления. Сначала добавьте этот стиль в Windows.Resources :
Во-вторых, вставьте этот код сразу после RowDefinitions элемента для внешнего Grid элемента в верхнюю часть страницы XAML:
Добавление обработчиков команд в класс MainWindow
Код программной части является минимальным, за исключением методов Add и DELETE. Навигация выполняется путем вызова методов для свойства View объекта CollectionViewSource. В этом DeleteOrderCommandHandler примере показано, как выполнить каскадное удаление в заказе. Сначала необходимо удалить связанные с ним Order_Details. UpdateCommandHandler Добавляет нового клиента или заказа в коллекцию или просто обновляет существующего клиента или заказ с учетом изменений, внесенных пользователем в текстовые поля.
Добавьте эти методы обработчика в класс MainWindow в MainWindow. XAML. CS. Если CollectionViewSource для таблицы Customers имеет другое имя, необходимо изменить имя в каждом из этих методов:
Выполнение приложения
Добавим в него строку подключения к бд, изменив файл следующим образом:
Для определения всех подключений в программе в пределах узла добавляется новый узел . В этом узле определяются строки подключения с помощью элемента . Каждая строка подключения имеет название, определяемое с помощью атрибута name . В данном случае строка подключения называется "DefaultConnection". Название может быть произвольное.
Атрибут connectionString собственно хранит строку подключения. Он состоит из трех частей:
Data Source=.\SQLEXPRESS : указывает на название сервера. По умолчанию для MS SQL Server Express используется ".\SQLEXPRESS"
Initial Catalog=mobiledb : название базы данных. Так как база данных называется mobiledb, то соответственно здесь данное название и указываем
Integrated Security=True : задает режим аутентификации
Так как мы будем подключаться к базе данных MS SQL Server, то соответственно мы будем использовать провайдер для SQL Server, функциональность которого заключена в пространстве имен System.Data.SqlClient.
Далее определим код графического интерфейса в xaml:
Здесь определен довольно простой интерфейс: датагрид для отображения данных, и две кнопки для обновления данных в бд и для удаления. В итоге приложение будет выглядеть следующим образом:
Чтобы задействовать эту функциональность, нам надо добавить в проект библиотеку System.Configuration.dll .
Далее в обработчике загрузки окна Window_Loaded создаем объект SqlDataAdapter:
В качестве команды для добавления объекта устанавливаем ссылку на хранимую процедуру:
Получаем данные из БД и осуществляем привязку:
За обновление отвечает метод UpdateDB() :
Чтобы обновить данные через SqlDataAdapter, нам нужна команда обновления, которую можно получить с помощью объекта SqlCommandBuilder. Для самого обновления вызывается метод adapter.Update() .
Причем не важно, что мы делаем в программе - добавляем, редактируем или удаляем строки. Метод adapter.Update сделает все необходимые действия. Дело в том, что при загрузке данных в объект DataTable система отслеживает состояние загруженных строк. В методе adapter.Update() состояние строк используется для генерации нужных выражений языка SQL, чтобы выполнить обновление базы данных. Более подробно про обновление с помощью адаптеров данных можно почитать здесь: Обновление БД из DataSet вручную
В обработчике кнопки обновления просто вызывается этот метод UpdateDB, а в обработчике кнопки удаления предварительно удаляются все выделенные строки.
Таким образом, мы можем вводить в DataGrid новые данные, редактировать там же уже существующие, сделать множество изменений, и после этого нажать на кнопку обновления, и все эти изменения синхронизируются с базой данных.
Причем важно отметить действие хранимой процедуры - при добавлении нового объекта данные уходят на сервер, и процедура возвращает нам id добавленной записи. Этот id играет большую роль при генерации нужного sql-выражения, если мы захотим эту запись изменить или удалить. И если бы не хранимая процедура, то нам пришлось бы после добавления данных загружать заново всю таблицу в datagrid, только чтобы у новой добавленной записи был в datagrid id. И хранимая процедура избавляет нас от этой работы.
Также здесь мы могли бы выполнять обновление данных сразу после редактирования строки. Для этого нужно задействовать событие RowEditEnding элемента DataGrid:
И если после окончания редактирования мы нажмем на Enter, то срабатает обработчик события RowEditEnding, который обновит базу данных.
Итак, здесь рассмотрен простейший способ работы с базой данных в WPF. Далее мы рассмотрим еще один способ, который подразумевает применение технологии Entity Framework.
SQLite является одной из наиболее используемых систем управления базами данных. Главным преимуществом SQLite является то, что для базы данных не нужно сервера. База данных представляет собой обычный локальный файл, который мы можем перемещать вместе с главным файлом приложения. Кроме того, для запросов к базе данных мы можем использовать стандартные выражения языка SQL, которые равным образом с некоторыми изменениями могут применяться и в других СУБД как Oracle, MS SQL Server, MySQL, Postgres и т.д.
Еще одним преимуществом является широкое распространение SQLite - область применения охватывает множество платфрм и технологий: WPF, Windows Forms, UWP, Xamarin, Android, iOS и т.д. И если мы, скажем, захотим создать копию приложения для ОС Android, то базу данных мы можем перенести в новое приложение такой, как она определена для приложения на WPF.
Либо мы можем добавить SQLite в проект через пакетный менеджер Nuget. Итак, выберем этот способ, перейдем к Nuget, нажав в проекте правой кнопкой на узел References и выбрав в открывшемся контекстном меню пункт Manage NuGet Packages. :
В окне менеджера Nuget введем в окно поиска "SQLite", и менеджер отобразит нам ряд результатов. Из них нам надо установить пакет под названием System.Data.SqlClient :
Данный пакет зависит от трех других пакетов, которые также будут установлены:
Вместе с последним пакетом также будет добавлен Entity Framework. Таким образом, мы сможем работать с базой данных SQLite через ORM-инструмент Entity Framework.
В отличие от работы с MS SQL Server по отношению к SQLite EF 6 не поддерживает автоматическое создание базы данных и ее таблиц через Code First в соответствии со структурой моделей приложения. И в этом случае нам самим надо создавать баз данных и ее таблицы.
Для работы с SQLite установим специальный инструмент - DB Browser for SQLite
Откроем DB Browser for SQLite и для создания новой базы данных нажмем на кнопку New Database . В оттрывшемся окне выберем место расположения файла базы данных и укажем для нее имя, например, mobiles .
Далее нам будет предложено добавить в базу данных таблицы. Определим для таблицы имя "Phones" и добавим четыре столбца Id, Title, Company, Price, как на скриншоте:
Стоит обратить внимание, что столбец Id определен здесь как первичный ключ.
После добавления таблицы мы сможем добавить вручную через DB Browser for SQLite какие-либо данные.
И далее добавим созданную нами базу данных в наш проект. После добавления для файла базы данных установим опцию "Copy if newer", чтобы файл копировался при компиляции в каталог приложения:
Для поддержки SQLite необходимо изменить конфигурацию проекта, которая располагается в файле App.config . После добавления пакетов данный файл также автоматически изменяется. Однако все же нам необходимо внести в него некоторые изменения. Так, изменим его следующим образом:
Прежде всего здесь определена строка подключения:
Так как созданный нами файл базы данных называется mobiles (к которому DB Browser for SQLite по умолчанию добавляет расширение db ), то в качестве источника данных здесь указан именно "mobiles.db".
Другой важный момент - установка в узле провайдера, который будет использоваться для подключения:
Теперь определим в проекте класс, объекты которого будут храниться в базе данных:
При ручном определении модели надо учитывать, что эта модель должна соответствовать таблице из БД. Так, в бд мы создали таблицу Phones, в которой есть целочисленные столбцы Id и Price, соответственно в классе Phone определены свойства Id и Price, представляющие целые числа. То же самое со строковыми столбцами Title и Company, которые по имени и типу данных соответствуют свойствам Title и Company в классе Phone.
И еще один важный момент: Entity Framework по умолчанию применяет некоторые условности при наименовании моделей и таблиц в БД. Так, название таблицы должно представлять название модели во множественном числе в соответствии с правилами английского языка. Так, у нас таблица называется Phones, а класс Phone. То есть условности соблюдены.
Для взаимодействия с базой данных нам нужен еще один комопнент - контекст данных. Добавим в проект новый класс, который назовем ApplicationContext:
Класс контекста должен наследоваться от DbContext. В конструкторе класса в конструктор базового класса передаем название подключения. В данном случае название должно совпадать с названием подключения из App.config.
И для взаимодействия с таблицей Phones здесь также определено одноименное свойство Phones .
Теперь все готово для работы с базой данных. Стандартный набор операций по работе с БД включает получение объектов, добавление, изменение и удаление. Для получения и просмотра списка объектов из бд мы будем использовать главное окно. А для добавления и изменения создадим новое окно.
Итак, добавим в проект новое окно, которое назовем PhoneWindow.xaml . В итоге общая конфигурация проекта у нас будет выглядеть следующим образом:
В коде xaml у страницы PhoneWindow.xaml определим следующее содержимое:
Здесь определены три поля ввода для каждого свойства модели Phone и две кнопки для сохранения и отмены.
В коде PhoneWindow.xaml.cs определим контекст для этой страницы:
Данное окно будет диалоговым. Через конструктор оно будет получать объект Phone, который устанавливается в качестве контекста данных.
В коде xaml у главного окна MainWindow определим вывод списка телефонов и набор кнопок для управления этим списком:
Выражение db.Phones.Load() загружает данные из таблицы Phones в локальный кэш контекста данных. И затем список загруженных объектов устанавливается в качестве контекста данных:
Для добавления вызывается метод Add:
Для удаления - метод Remove:
При изменении мы передаем в PhoneWindow копию выбранного объекта. Если мы передавали бы сам выделенный объект, то все изменения на форме автоматически синхронизировались со списком, и не было бы смысла в кнопке отмены.
После получения измененного объекта мы находим его в базе данных и устанавливаем у него состояние Modified, после чего сохраняем все изменения:
Читайте также: