Поделиться через


Создание базы данных с помощью Code First

В этом видео и пошаговом руководстве приведены общие сведения о разработке code First, предназначенных для новой базы данных. Этот сценарий включает в себя назначение базы данных, в которую не существует, и code First создаст или пустую базу данных, в которую будет добавляться новая таблица. Code First позволяет определить модель с помощью C# или VB.Net классов. Дополнительная конфигурация может быть выполнена с помощью атрибутов в классах и свойствах или с помощью свободного API.

Просмотреть видео

Это видео содержит введение в разработку Code First, предназначенную для новой базы данных. Этот сценарий включает в себя назначение базы данных, в которую не существует, и code First создаст или пустую базу данных, в которую будет добавляться новая таблица. Code First позволяет определить модель с помощью C# или VB.Net классов. Дополнительная конфигурация может быть выполнена с помощью атрибутов в классах и свойствах или с помощью свободного API.

Представляет: Роуэн Миллер (Rowan Miller)

Видео: WMV MP4 | WMV | (ZIP)

Предварительные требования

Для выполнения этого пошагового руководства необходимо установить по крайней мере 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.

Это только соглашения по умолчанию, и существуют различные способы изменения базы данных, которые сначала использует код, дополнительные сведения доступны в разделе "Как DbContext Обнаружения модели и базы данных Подключение ion". Вы можете подключиться к этой базе данных с помощью сервера Обозреватель в Visual Studio

  • Представление —> Обозреватель сервера

  • Щелкните правой кнопкой мыши данные Подключение и выберите "Добавить Подключение".

  • Если вы не подключились к базе данных из сервера Обозреватель, прежде чем выбрать Microsoft SQL Server в качестве источника данных

    Select Data Source

  • Подключение в LocalDB или SQL Express в зависимости от установленного экземпляра

Теперь можно проверить схему, созданную кодом.

Schema Initial

DbContext разработал классы для включения в модель, просмотрев свойства DbSet, которые мы определили. Затем он использует набор соглашений Code First для определения имен таблиц и столбцов, определения типов данных, поиска первичных ключей и т. д. Далее в этом пошаговом руководстве мы рассмотрим, как можно переопределить эти соглашения.

5. Работа с изменениями модели

Теперь пришло время внести некоторые изменения в модель, когда мы внося эти изменения, мы также должны обновить схему базы данных. Для этого мы будем использовать функцию с именем Code First Migrations или Migrations для короткого времени.

Миграции позволяют использовать упорядоченный набор шагов, описывающих обновление (и понижение) схемы базы данных. Каждый из этих шагов, известный как миграция, содержит код, описывающий применяемые изменения. 

Первый шаг — включить миграцию кода для нашего блога BloggingContext.

  • Средства —> библиотека диспетчер пакетов —> консоль диспетчер пакетов

  • Запустите команду Enable-Migrations в консоли диспетчера пакетов.

  • В проект добавлена новая папка Migrations, содержащая два элемента:

    • Configuration.cs — этот файл содержит параметры, которые будут использоваться для миграции BloggingContext. Для этого пошагового руководства нам не нужно ничего изменить, но здесь можно указать начальные данные, зарегистрировать поставщиков для других баз данных, изменить пространство имен, в котором создаются миграции и т. д.
    • <timestamp>_InitialCreate.cs — это первая миграция, она представляет изменения, которые уже применены к базе данных, чтобы взять ее из пустой базы данных в одну, включающую таблицы блогов и записей. Хотя мы позволяем коду сначала автоматически создавать эти таблицы, теперь, когда мы выбрали миграцию, они были преобразованы в миграцию. 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. Таблица блогов. При необходимости мы могли бы изменить шаблонный код, но это не обязательно в этом случае.
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-адреса теперь добавляется в таблицу блогов в базе данных:

Schema With 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;
  • Теперь заметите свойство Имени пользователя, чтобы определить, что он является первичным ключом
public class User
{
    [Key]
    public string Username { get; set; }
    public string DisplayName { get; set; }
}
  • Использование команды Add-Migration AddUser для формирования шаблонов миграции для применения этих изменений к базе данных
  • Выполните команду Update-Database, чтобы применить новую миграцию к базе данных

Новая таблица теперь добавляется в базу данных:

Schema With Users

Полный список заметок, поддерживаемых EF:

7. API Fluent

В предыдущем разделе мы рассмотрели использование заметок данных для дополнения или переопределения того, что было обнаружено по соглашению. Другой способ настройки модели — через API-интерфейс code First fluent.

Большинство конфигураций модели можно сделать с помощью простых заметок данных. Api fluent — это более сложный способ указания конфигурации модели, которая охватывает все, что заметки данных могут выполнять в дополнение к более расширенной конфигурации с заметками данных. Заметки к данным и 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:

Schema With Display Name Renamed

Итоги

В этом пошаговом руководстве мы рассмотрели разработку code First с помощью новой базы данных. Мы определили модель с помощью классов, а затем использовали ее для создания базы данных и хранения и извлечения данных. После создания базы данных мы использовали code First Migrations для изменения схемы по мере развития модели. Мы также узнали, как настроить модель с помощью заметок данных и API Fluent.