Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом видео и пошаговом руководстве представлены общие сведения о разработке Code First, ориентированной на новую базу данных. Этот сценарий включает в себя использование базы данных, которой не существует, и Code First её создаст, или пустую базу данных, к которой Code First добавит новые таблицы. Code First позволяет определить модель с помощью C# или VB.Net классов. Дополнительная конфигурация может быть выполнена с помощью атрибутов в классах и свойствах или с помощью свободного API.
Посмотрите видео
Это видео содержит введение в разработку Code First, предназначенную для новой базы данных. Этот сценарий включает в себя либо нацеливание на несуществующую базу данных, которую Code First создаст, либо на пустую базу данных, в которую Code First добавит новые таблицы. Code First позволяет определить модель с помощью C# или VB.Net классов. Дополнительная конфигурация может быть выполнена с помощью атрибутов в классах и свойствах или с помощью свободного API.
Представлено: Роуэн Миллер
Необходимые условия
Для выполнения этого пошагового руководства необходимо установить по крайней мере Visual Studio 2010 или Visual Studio 2012.
Если вы используете Visual Studio 2010, вам также потребуется установить NuGet .
1. Создание приложения
Чтобы упростить работу, мы создадим базовое консольное приложение, использующее Code First для доступа к данным.
- Запустите Visual Studio
- Файл —> создать проект> ...
- Выберите Windows в меню слева и консольное приложение
- Введите CodeFirstNewDatabaseSample в качестве имени
- Нажмите кнопку "ОК"
2. Создание модели
Определим простую модель с помощью классов. Мы просто определяем их в файле Program.cs, но в реальном приложении классы обычно разделяют по отдельным файлам и, возможно, в отдельный проект.
Под определением класса Program в Program.cs добавьте следующие два класса.
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
Вы заметите, что мы делаем два свойства навигации (Blog.Post и Post.Blog) виртуальными. Это позволяет отложенной загрузке компонента Entity Framework. Отложенная загрузка означает, что содержимое этих свойств будет автоматически загружено из базы данных при попытке доступа к ним.
3. Создание контекста
Теперь пришло время определить производный контекст, который представляет сеанс с базой данных, позволяя нам запрашивать и сохранять данные. Мы определяем контекст, производный от System.Data.Entity.DbContext и предоставляющий типизированный dbSet<TEntity> для каждого класса в нашей модели.
Теперь мы начинаем использовать типы из Entity Framework, поэтому нам нужно добавить пакет NuGet EntityFramework.
- Проект —> управление пакетами NuGet... Примечание. Если у вас нет параметра "Управление пакетами NuGet..." необходимо установить последнюю версию NuGet.
- Выберите вкладку "Интернет"
- Выберите пакет EntityFramework
- Щелкните Установить.
Добавьте инструкцию using для System.Data.Entity в верхней части Program.cs.
using System.Data.Entity;
Под классом Post в Program.cs добавьте следующий производный контекст.
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
Ниже приведен полный список того, что Program.cs теперь должно содержать.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
namespace CodeFirstNewDatabaseSample
{
class Program
{
static void Main(string[] args)
{
}
}
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
}
Это весь код, который мы должны начать хранить и извлекать данные. Очевидно, что за кулисами происходит довольно много, и мы рассмотрим это через мгновение, но сначала давайте увидим, как это работает на практике.
4. Чтение и запись данных
Реализуйте метод Main в Program.cs, как показано ниже. Этот код создает новый экземпляр нашего контекста, а затем использует его для вставки нового блога. Затем он использует запрос LINQ для получения всех блогов из базы данных, упорядоченной по алфавиту по названию.
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine();
var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;
Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
Теперь вы можете запустить приложение и протестировать его.
Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
ADO.NET Blog
Press any key to exit...
Где мои данные?
По соглашению DbContext создал базу данных для вас.
- Если локальный экземпляр SQL Express доступен (установлен по умолчанию с Visual Studio 2010), code First создал базу данных на этом экземпляре.
- Если SQL Express недоступен, код сначала попытается использовать LocalDB (установлен по умолчанию с Visual Studio 2012)
- База данных называется в честь полного имени производного контекста, в нашем случае — CodeFirstNewDatabaseSample.BloggingContext.
Это только соглашения по умолчанию, и существуют различные способы изменения базы данных, которые использует подход Code First. Дополнительные сведения доступны в теме "Как DbContext обнаруживает модель и подключение к базе данных". Вы можете подключиться к этой базе данных с помощью обозревателя серверов в Visual Studio
Вид —> Обозреватель серверов
Щелкните правой кнопкой мыши Подключения к данным и выберите Добавить подключение...
Если вы ранее не подключались к базе данных из обозревателя серверов, вам нужно будет выбрать Microsoft SQL Server в качестве источника данных.
Подключитесь к LocalDB или SQL Express в зависимости от того, что у вас установлено
Теперь мы можем проверить схему, созданную при помощи Code First.
DbContext разработал классы для включения в модель, просмотрев свойства DbSet, которые мы определили. Затем он использует набор соглашений Code First для определения имен таблиц и столбцов, определения типов данных, поиска первичных ключей и т. д. Далее в этом пошаговом руководстве мы рассмотрим, как можно переопределить эти соглашения.
5. Работа с изменениями модели
Теперь пришло время внести некоторые изменения в модель, когда мы внося эти изменения, мы также должны обновить схему базы данных. Для этого мы будем использовать функцию, называемую Code First Migrations, или кратко Migrations.
Миграции позволяют использовать упорядоченный набор шагов, описывающих обновление (и понижение) схемы базы данных. Каждый из этих шагов, известный как миграция, содержит код, описывающий применяемые изменения.
Первый шаг — включить миграцию кода для нашего блога BloggingContext.
Средства —> диспетчер пакетов библиотеки —> консоль диспетчера пакетов
Выполните команду Enable-Migrations в консоли диспетчера пакетов
В проект добавлена новая папка Migrations, содержащая два элемента:
- Configuration.cs — этот файл содержит параметры, которые будут использоваться для миграции BloggingContext. Для этого пошагового руководства нам не нужно ничего изменить, но здесь можно указать начальные данные, зарегистрировать поставщиков для других баз данных, изменить пространство имен, в котором создаются миграции и т. д.
- <таймстамп>_InitialCreate.cs – Это ваша первая миграция, которая отражает изменения, уже примененные к базе данных, чтобы преобразовать её из пустой базы данных в ту, которая включает таблицы Blogs и Posts. Хотя мы позволяем Code First автоматически создавать эти таблицы, теперь, когда мы включили поддержку миграций, они были модифицированы для использования с миграциями. Code First также записал в локальной базе данных, что эта миграция уже применена. Метка времени на имени файла используется для упорядочивания.
Теперь давайте внесите изменения в нашу модель, добавьте свойство URL-адреса в класс Блога:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public virtual List<Post> Posts { get; set; }
}
- Выполните команду Add-Migration AddUrl в консоли диспетчера пакетов. Команда Add-Migration проверяет наличие изменений после последней миграции и создаёт новую миграцию с найденными изменениями. Мы можем присвоить миграции имя; в этом случае мы называем миграцию AddUrl. Шаблонный код указывает, что нам нужно добавить столбец Url, который может содержать строковые данные, в таблицу dbo.Blogs. При необходимости мы могли бы изменить шаблонный код, но это не обязательно в этом случае.
namespace CodeFirstNewDatabaseSample.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddUrl : DbMigration
{
public override void Up()
{
AddColumn("dbo.Blogs", "Url", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Blogs", "Url");
}
}
}
- Выполните команду Update-Database в консоли диспетчера пакетов. Эта команда применит любые ожидающие миграции к базе данных. Наша миграция InitialCreate уже применена, поэтому теперь будет добавлена только новая миграция AddUrl. Совет. Вы можете использовать параметр -Verbose при вызове Update-Database для просмотра SQL, выполняемого в базе данных.
Новый столбец URL-адреса теперь добавляется в таблицу блогов в базе данных:
6. Заметки к данным
До сих пор мы просто позволяли EF обнаруживать модель, используя свои соглашения по умолчанию, но иногда наши классы не следуют этим соглашениям, и нам нужно будет выполнить дополнительную настройку. В этом случае существует два варианта: мы рассмотрим Аннотации данных в этом разделе, а затем функциональный API в следующем разделе.
- Давайте добавим класс User в нашу модель
public class User
{
public string Username { get; set; }
public string DisplayName { get; set; }
}
- Нам также нужно добавить набор в производный контекст.
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<User> Users { get; set; }
}
- Если мы попытались добавить миграцию, мы получим ошибку с сообщением "EntityType "Пользователь" не имеет ключа. Определите ключ для этого EntityType". Так как EF не имеет способа знать, что имя пользователя должно быть первичным ключом для пользователя.
- Теперь мы будем использовать аннотации данных, поэтому нам нужно добавить инструкцию using в начало Program.cs.
using System.ComponentModel.DataAnnotations;
- Теперь аннотируйте свойство Username, чтобы указать, что оно является первичным ключом.
public class User
{
[Key]
public string Username { get; set; }
public string DisplayName { get; set; }
}
- Используйте команду Add-Migration AddUser, чтобы создать заготовку миграции для применения этих изменений к базе данных.
- Выполните команду Update-Database , чтобы применить новую миграцию к базе данных
Новая таблица теперь добавляется в базу данных:
Полный список заметок, поддерживаемых EF:
- KeyAttribute
- StringLengthAttribute
- MaxLengthAttribute
- ConcurrencyCheckAttribute
- RequiredAttribute
- TimestampAttribute
- ComplexTypeAttribute
- ColumnAttribute
- TableAttribute
- InversePropertyAttribute
- ForeignKeyAttribute
- DatabaseGeneratedAttribute
- NotMappedAttribute
7. Флюент API
В предыдущем разделе мы рассмотрели использование аннотаций данных для дополнения или переопределения того, что было обнаружено по соглашению. Другой способ настройки модели — через API-интерфейс code First fluent.
Большинство конфигураций модели можно сделать с помощью простых заметок данных. Fluent API — это более продвинутый способ указания конфигурации модели, который охватывает все, что могут сделать аннотации данных, а также некоторые более продвинутые конфигурации, невозможные с помощью аннотаций данных. Заметки к данным и API fluent можно использовать вместе.
Чтобы получить доступ к свободному API, переопределите метод OnModelCreating в DbContext. Предположим, что мы хотели переименовать столбец, в который хранится User.DisplayName, в display_name.
- Переопределите метод OnModelCreating в BloggingContext со следующим кодом.
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.Property(u => u.DisplayName)
.HasColumnName("display_name");
}
}
- Используйте команду Add-Migration ChangeDisplayName, чтобы создать миграцию для применения этих изменений к базе данных.
- Выполните команду Update-Database , чтобы применить новую миграцию к базе данных.
Столбец DisplayName теперь переименован в display_name:
Сводка
В этом пошаговом руководстве мы рассмотрели разработку code First с помощью новой базы данных. Мы определили модель с помощью классов, а затем использовали ее для создания базы данных и хранения и извлечения данных. После создания базы данных мы использовали code First Migrations для изменения схемы по мере развития модели. Мы также узнали, как настроить модель с помощью заметок данных и API Fluent.