Краткие теоретические сведения
Чтобы начать работу с Entity Framework, необходимо создать приложение. В качестве среды разработки можно использовать Visual Studio 2013 или Visual Studio 2013 Express for Desktop.
Создайте новый проект по типу Console Application (рисунок Б.2).
Рисунок Б.2 – Новый проект
Добавьте новый класс, который будет описывать данные. Допустим, приложение будет посвящено работе с пользователями: класс User:
1
2
3
4
5
6
| public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
|
Это обычный класс, который содержит некоторое количество автосвойств. Каждое свойство будет сопоставляться с отдельным столбцом в таблице из базы данных.
Надо отметить, что Entity Framework при работе с Code First требует определения ключа элемента для создания первичного ключа в таблице в базе данных. По умолчанию при генерации базы данных Entity Framework в качестве первичных ключей будет рассматривать свойства с именами Id или [Имя_класса]Id (то есть UserId). Если ключевое свойство называется иначе, то необходимо внести дополнительную логику на С#.
Для взаимодействия с базой даных нужен контекст данных. Это своего рода посредник между базой данных и классами, описывающими данные. По умолчанию библиотека для EF еще не добавлена. Чтобы ее добавить, необходимо выбрать в контекстном меню решения Manage NuGet Packages...
Затем в появившемся окне управления NuGet-пакетами в окне поиска ввести слово "Entity", выбрать пакет Entity Framework и установить его (рисунок Б.3).
Рисунок Б.3 – Установка Entity Framework
После установки пакета добавить в проект новый класс UserContext:
| using System;
using System.Collections.Generic;
using System.Data.Entity;
namespace FirstEF6App
{
class UserContext: DbContext
{
public UserContext()
:base("DbConnection")
{ }
public DbSet<User> Users { get; set; }
}
}
|
Основу функциональности Entity Framework составляют классы, находящиеся в пространстве имен System.Data.Entity. Среди всего набора классов этого пространства имен следует выделить следующие:
-
DbContext : определяет контекст данных, используемый для взаимодействия с базой данных. -
DbModelBuilder : сопоставляет классы на языке C# с сущностями в базе данных. -
DbSet/DbSet<TEntity> : представляет набор сущностей, хранящихся в базе данных
В любом приложении, работающим с базой данных через Entity Framework, необходим контекст (класс производный от DbContext) и набор данных DbSet, через который осуществляется взаимодействие с таблицами из базы данных. В данном случае таким контекстом является класс UserContext.
В конструкторе этого класса вызывается конструктор базового класса, в который передается строка "DbConnection" - это имя будущей строки подключения к базе данных. В принципе можно не использовать конструктор, тогда в этом случае строка подключения будет носить имя самого класса контекста данных.
В классе определено одно свойство Users, которое будет хранить набор объектов User. В классе контекста данных набор объектов представляет класс DbSet<T>. Через это свойство будет осуществляться связь с таблицей объектов User с базой данных.
Необходимо установить подключение к базе данных. Для установки подключения обычно используется файл конфигурации приложения. В проектах для десктопных приложений файл конфигурации называется App.config (как в нашем случае), в проектах веб-приложений - web.config. В данном случае это файл App.config. После добавления Entity Framework он выглядит примерно следующим образом:
| <?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,
EntityFramework, Version=6.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<entityFramework>
<defaultConnectionFactory
type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient"
type="System.Data.Entity.SqlServer.SqlProviderServices,
EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
|
После закрывающего тега </configSections> необходимо добавить следующий элемент:
| <connectionStrings>
<add name="DBConnection" connectionString="data
source=(localdb)\v11.0;Initial Catalog=userstore.mdf;Integrated Security=True;"
providerName="System.Data.SqlClient"/>
</connectionStrings>
|
Все подключения к источникам данных устанавливаются в секции connectionStrings, а каждое отдельное подключение представляет элемент add. В конструкторе класса контекста UserContext в качестве названия подключения передается строка "DbConnection", поэтому данное название указывается в атрибуте name="DBConnection".
Настройку строки подключения задает атрибут connectionString. В данном случае устанавливается название базы данных, с которой будет осуществляться взаимодействие - userstore.mdf.
Теперь необходимо перейти к файлу Program.cs и изменить его содержание следующим образом:
| using System;
namespace FirstEF6App
{
class Program
{
static void Main(string[] args)
{
using(UserContext db = new UserContext())
{
// создаем два объекта User
User user1 = new User { Name = "Tom", Age = 33 };
User user2 = new User { Name = "Sam", Age = 26 };
// добавляем их в бд
db.Users.Add(user1);
db.Users.Add(user2);
db.SaveChanges();
Console.WriteLine("Объекты успешно сохранены");
// получаем объекты из бд и выводим на консоль
var users = db.Users;
Console.WriteLine("Список объектов:");
foreach(User u in users)
{
Console.WriteLine("{0}.{1} - {2}", u.Id, u.Name, u.Age);
}
}
Console.Read();
}
}
}
|
Так как класс UserContext через родительский класс DbContext реализует интерфейс IDisposable, то для работы с UserContext с автоматическим закрытием данного объекта можно использовать конструкцию using.
В конструкции using создаются два объекта User и добавляются в базу данных. Для их сохранения достаточно использовать метод Add: db.Users.Add(user1)
Чтобы получить список данных из базы данных, достаточно воспользоваться свойством Users контекста данных: db.Users
В результате после запуска программа выведет на консоль:
Объекты успешно сохранены
Список объектов:
1.Tom - 33
2.Sam - 26
Таким образом, Entity Framework обеспечивает простое и удобное управление объектами из базы данных. При том в данном случае нет необходимости даже создавать базу данных и определять в ней таблицы. Entity Framework это сделает на основе определения класса контекста данных и классов моделей. И если база данных уже имеется, то EF не будет повторно создавать ее.
Основная задача - только определить модель, которая будет храниться в базе данных, и класс контекста. Поэтому данный подход называется Code First - сначала пишется код, а потом по нему создается база данных и ее таблицы.
Возникает вопрос, а где же находится база данных? Чтобы физически увидеть базу данных, можно подключиться к ней из Visual Studio через окно Database Explorer или через специальный инструмент управления SQL Server Management Studio.
Для просмотра базы данных через Visul Studio необходимо выбрать в меню пункт View->Other Windows->Database Explorer. В окне Database Explorer необходимо подключиться к новой базе данных, выбрав Connect to Database.
В окне добавления подключения указывается сервер (localdb)\v11.0 и название базы данных.
Физически база данных будет располагаться в каталоге SQL Servera, например, C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA , только назваться она будет по названию подключения - DbConnection.mdf.
При создании таблиц и их столбцов в базе данных в Entity Framework по умолчанию действуют некоторые соглашения по именованию, которые указывают, какие имена должны быть у таблиц, столбцов, какие типы и т.д. Рассмотрим некоторые из этих соглашений.
Типы SQL Server и C# сопоставляются следующим образом:
- int: int
- bit: bool
- char: string
- date: DateTime
- datetime: DateTime
- datetime2: DateTime
- decimal: decimal
- float: double
- money: decimal
- nchar: string
- ntext: string
- numeric: decimal
- nvarchar: string
- real: float
- smallint: short
- text: string
- tinyint: byte
- varchar: string
Все первичные ключи по умолчанию имеют определение NOT NULL.
Столбцы, сопоставляемые со свойствами ссылочных типов (string, array), в базе данных имеют определение NULL, а все значимые типы (DateTime, bool, char, decimal, int, double, float) - NOT NULL.
Если свойство имеет тип Nullable<T>, то оно сопоставляется со столбцом с определением NULL.
Entity Framework требует наличия первичного ключа, так как это позволяет ему отслеживать объекты. По умолчанию в качестве ключей EF рассматривает свойства с именем Id или [Название_типа]Id (например, PostId в классе Post).
Как правило, ключи имеют тип int или GUID, но также могут представлять и любой другой примитивный тип.
С помощью специального класса PluralizationService Entity Framework проводит сопоставление между именами классов моделей и именами таблиц. При этом таблицы получают по умолчанию в качестве названия множественное число в соответствии с правилами английского языка, например, класс User - таблица Users, класс Person - таблица People (но не Persons!).
Названия столбцов получают названия свойств модели.
Если нас не устраивают названия таблиц и столбцов по умолчанию, то мы можем переопределить данный механизм с помощью Fluent API или аннотаций.
4 Отчет и контрольные вопросы
Отчет составляется в текстовом редакторе, содержит исходные данные, результаты выполнения заданий и ответы на поставленные вопросы.
Защита лабораторной работы проводится на основании представленного отчета и контрольных вопросов из следующего списка:
1) Дайте определение Entity Framework. Назовите преимущества.
2) В чем заключаются особенности Entity Framework Code First?
3) Назовите этапы создания базы данных на основе Entity Framework Code First.
Воспользуйтесь поиском по сайту: