Министерство образования Республики Беларусь Министерство образования и науки Российской Федерации ГУВПО “Белорусско-Российский университет” Кафедра “Программное обеспечение информационных технологий” Дисциплина “Объектно-ориентированное программирование и проектирование” Лабораторная работа № 12 Работа с базами данных с использованием технологии ADO.NET Entity Framework Время выполнения работы – 4 часа 2014 1 Цель работы Ознакомление с основой разработки Windows-приложений на языке C# для работы с базами данных на основе технологии ADO.NET Entity Framework. 2 Техническое обеспечение 2.1 Персональная ЭВМ IBM Pentium IV и более поздних моделей c оперативной памятью не менее 512 Мбайт. 2.2 Клавиатура. 2.3 Дисплей. 2.4 Манипулятор типа “мышь”. 3 Программное обеспечение 3.1 Операционная система Windows XP SP 3 более поздние версии Windows. 3.2 Система программирования Microsoft Visual Studio 2008 и более поздние версии. 4 Постановка задачи 2 Разработать Windows-приложение WPF для базы данных СУБД Microsoft SQL Server, реализованной согласно варианта задания, которые приведены в прилагаемых файлах. 5 Доступ к базе данных 5.1 Связывание данных с элементом управления в WPF WPF предоставляет в распоряжение программиста гораздо больше возможностей для форматирования, чем Windows Forms, однако в примере, приведенном далее, мы будем выводить на экран данные в том же формате, что и раньше. Полный текст примера находится в проекте DatabindingWPF в коде, сопровождающем эту работу. Вначале напишем на языке XAML (Extensible Application Markup Language, расширяемый язык разметки приложений) код для окна: <Window х:Class="DataBindingWPF.Windowl" xmlns = "http: / /schemas .microsoft. com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Data Binding Demo (WPF)" Height="301" Width="477"> <Grid> <ListView Name="listViewl"> <ListView.View> <GridView> <GridViewColumn Header="ID" Width="3 5" DisplayMemberBinding="{Binding Path=BookID}"/> <GridViewColumn Header="Title" Width="2 00" DisplayMemberBinding="{Binding Path=Title}"/> <GridViewColumn Header="Published" Width="70" DisplayMemberBindings"{Binding Path=PublishYear}"/> </GridView> </ListView.View> </ListView> </Grid> </Window> А теперь код программы: 3 public partial class Windowl : Window { DataSet _dataSet; public Windowl () { InitializeComponent(); _dataSet = CreateDataSet(); listViewl.DataContext = _dataSet.Tables["Books"]; Binding binding = new Binding(); listViewl.SetBinding(ListView.Iterns SourceProperty, binding); } protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { _dataSet.Dispose(); } private DataSet CreateDataSet() { string connectionString = ©"Data source=BEN-DESKTOP\SQLEXPRESS; Initial Catalog=TestDB;Integrated Security=SSPI"; using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand("SELECT * FROM Books", conn)) using (SqlDataAdapter adapter = new SqlDataAdapter()) { adapter.TableMappings.Add("Table", "Books"); adapter.SelectCommand = cmd; DataSet dataSet = new DataSet("Books"); // Поместить все строки в набор данных adapter.Fill(dataSet) ; return dataSet; } } } } На рис. 1 изображена WPF-версия элемента управления DataGrid с информацией из базы данных. Технология WPF позволяет связывать значения в любом элементе управления с источником данных 5.2 Автоматическое отображение данных на объекты с помощью платформы Entity Framework 4 Задача. Вы хотите обращаться к базе данных при посредстве объектов платформы .NET, не создавая собственную библиотеку объектов данных. Решение. Воспользуйтесь платформой Entity Framework. Она позволяет автоматически отображать таблицы базы данных и их отношения на объекты, которые можно использовать в коде С#. По сути, Entity Framework является библиотекой объектно-реляционного сопоставления. Она создана корпорацией Microsoft и полностью интегрируется в Visual Studio. Чтобы создать объект для таблицы Books, представленной ранее в этой главе, выполните следующие шаги: 1) Сделайте щелчок правой кнопкой мыши по имени проекта и выберите Add (Добавить), New Item (Новый элемент). 2) Выберите ADO.NET Entity Data Model (Модель данных ADO.NET Entity) и дайте ей имя Books.edmx. Щелкните по Add (Добавить). 3) В Мастере Entity Data Model Wizard, который при этом появится, выберите Generate From Database (Сгенерировать по базе данных) и щелкните по Next (Далее). 4) Выберите базу данных в раскрывающемся списке. 5) В качестве значения для Save entity connection settings in App.Config as (Сохранить настройки соединения сущности в App.Config как) укажите BookEntities 6) Щелкните по Next (Далее). 7) Установите флажок у таблицы Books. 8) В качестве значения для Model Namespace (Пространство имен модели) укажите BookModel и щелкните по Finish (Готово). 9) В результате будут созданы объекты Book и BookEntities. В следующих разделах приводятся примеры работы с ними. 5.2.1 Получение списка всех сущностей Объект представляет интерфейс и коллекции. В следующем примере выводятся все значения таблицы, для чего используется коллекция сущностей: // Получить список всех сущностей BookEntities entities = new BookEntities(); foreach (var book in entities.Books) { Console.WriteLine("{0}, {1} {2}", book.ID, book.Title, book.PublishYear); } Этот код выводит: Les Miserables 1862 Notre-Dame de Paris 1831 Le Rhin 1842 5.2.2 Создание новой сущности Чтобы создать новую сущность Book, просто объявите объект, установите значения его свойств, а затем добавьте его в коллекцию сущностей. В нашем примере свойство id инкрементируется автоматически, так что устанавливать его значение не нужно. BookEntities entities = new BookEntities(); Book newBook = new Book(); newBook.Title = "C# 4 How-to"; newBook.PublishYear = 2010; entities.AddToBooks(newBook); entities.SaveChanges(); 5.2.3 Поиск сущности Для создания запросов можно воспользоваться классом objectQuery<T>: ObjectQuery<Book> bookQuery = new ObjectQuery<Book>( "SELECT VALUE Book FROM BookEntities.Books AS Book", entities).Where("it.ID = 1"); Впрочем, выражения быстро становятся громоздкими. В этом случае лучше использовать механизм LINQ. Эквивалентный запрос будет выглядеть примерно так: 5 var books = from book in entities.Books where book.ID == 1 select book; 5.2.4 Удаление сущности Чтобы удалить сущность, передайте ее методу DeleteObject объекта, представляющего список сущностей: BookEntities entities = new BookEntities(); // Создать новую сущность Book newBook = new Book () ; newBook.Title = "C# 4 How-to"; newBook.PublishYear = 2010; entities.AddToBooks(newBook); entities.SaveChanges(); entities.DeleteObject(newBook); entities.SaveChanges(); 6 Литература 1. Нейгел, Кристиан. C# 4.0 и платформа .NET 4 для профессионалов.: пер. с англ./ Кристиан Нейгел, Билл Ивьен, Джей Глинн, Карли Уотсон. – М.: Вильямс, 2011. – 1440 с. 2. Зиборов, В. В. Visual C# 2010 на примерах/ В. В. Зиборов. – СПб.: БХВПетербург, 2011. – 432 с.