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

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

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

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

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

Видео: WMVMP4WMV (ZIP)

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

для выполнения инструкций этого пошагового руководства необходимо установить по крайней мере Visual Studio 2010 или Visual Studio 2012.

если вы используете Visual Studio 2010, также необходимо установить NuGet .

1. Создание приложения

чтобы не усложнять, мы создадим простое консольное приложение, которое использует Code First для доступа к данным.

  • Открытие Visual Studio
  • Файл — создать > Project...
  • выберите Windows в меню слева и в консольном приложении .
  • Введите кодефирстневдатабасесампле в качестве имени
  • Нажмите кнопку ОК

2. Создание модели

Давайте определим очень простую модель с помощью классов. Мы просто определяем их в файле Program. cs, но в реальном мире вы разбиваете классы на отдельные файлы и, возможно, на отдельный проект.

Под определением класса программы в 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. posts и Post.Blog) являются виртуальными. Это включает функцию отложенной загрузки Entity Framework. Отложенная загрузка означает, что содержимое этих свойств будет автоматически загружаться из базы данных при попытке доступа к ним.

3. Создание контекста

Теперь пора определить производный контекст, который представляет сеанс с базой данных, что позволит нам запрашивать и сохранять данные. Мы определяем контекст, производный от System. Data. Entity. DbContext, и предоставляет типизированный DbSetный < домик > для каждого класса в нашей модели.

теперь мы начали использовать типы из Entity Framework, поэтому нам нужно добавить пакет NuGet EntityFramework.

  • Project — > управление пакетами NuGet... примечание. если у вас нет параметра " управление пакетами NuGet... ", следует установить последнюю версию NuGet
  • Выбор вкладки "в сети "
  • Выберите пакет EntityFramework
  • Щелкните Установить.

Добавьте инструкцию using для System. Data. Entity в начало программы. cs.

using System.Data.Entity;

Под классом POST в Program. cs добавьте следующий производный контекст.

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

Ниже приведен полный список сведений о программе. 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 доступен (устанавливается по умолчанию с Visual Studio 2010), Code First создает базу данных на этом экземпляре.
  • если SQL Express недоступна, Code First попытается использовать LocalDB (устанавливается по умолчанию с Visual Studio 2012).
  • База данных именуется после полного имени производного контекста, в нашем случае это кодефирстневдатабасесампле. BloggingContext

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

  • Просмотр — Обозреватель сервера

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

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

    Select Data Source

  • Подключение либо LocalDB, либо SQL Express в зависимости от того, какой из них был установлен.

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

Schema Initial

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

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

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

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

первым шагом является включение Code First Migrations для нашего BloggingContext.

  • инструменты- библиотека диспетчер пакетов — > консоль диспетчер пакетов

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

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

    • Configuration. CS — этот файл содержит параметры, которые будут использоваться миграцией для миграции BloggingContext. Нам не нужно ничего менять в этом пошаговом руководстве, но здесь можно указать начальные данные, зарегистрировать поставщики для других баз данных, изменить пространство имен, в котором создаются миграции, и т. д.
    • timestamp > _InitialCreate. CS — это первая миграция, которая представляет изменения, уже примененные к базе данных для того, чтобы сделать ее пустой базой данных, которая включает таблицы блогов и записей. хотя мы позволяем Code First автоматически создавать эти таблицы для нас, теперь, когда мы участвуем в миграции, они были преобразованы в миграцию. Code First также записана в локальную базу данных, к которой уже применена эта миграция. Метка времени для имени файла используется для упорядочения.

    Теперь изменим нашу модель, добавив свойство URL в класс Blog:

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 аддурл в консоли диспетчер пакетов. Команда Add-Migration проверяет наличие изменений с момента последней миграции и формирует новую миграцию с любыми найденными изменениями. Мы можем присвоить имя миграции. в этом случае вызывается миграция "Аддурл". Шаблонный код говорит, что нам нужно добавить столбец 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");
        }
    }
}
  • выполните команду обновления базы данных в консоли диспетчер пакетов. Эта команда применит все незавершенные миграции к базе данных. Наша InitialCreate миграция уже применена, поэтому миграция будет просто применена к нашей новой Аддурл миграции. совет. параметр – verbose можно использовать при вызове Update-Database для просмотра SQL, выполняемой в базе данных.

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

Schema With Url

6. заметки к данным

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

  • Давайте добавим в нашу модель класс 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 "User" не определен. Определите ключ для этого типа EntityType ". Поскольку EF не имеет возможности знать, что имя пользователя должно быть первичным ключом для пользователя.
  • Теперь мы будем использовать заметки к данным, поэтому нам нужно добавить инструкцию using в начало программы. CS
using System.ComponentModel.DataAnnotations;
  • Теперь добавьте аннотацию для свойства UserName, чтобы обозначить, что это первичный ключ
public class User
{
    [Key]
    public string Username { get; set; }
    public string DisplayName { get; set; }
}
  • Используйте команду adduser для добавления и миграции , чтобы сформировать шаблон миграции, чтобы применить эти изменения к базе данных.
  • Выполните команду обновления базы данных , чтобы применить новую миграцию к базе данных.

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

Schema With Users

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

7. Fluent API

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

Большую часть конфигурации модели можно выполнить с помощью простых заметок к данным. API-интерфейс Fluent — это более сложный способ определения конфигурации модели, охватывающий все возможности, которые могут делать заметки к данным в дополнение к более сложной конфигурации с заметками данных. Заметки к данным и API Fluent можно использовать вместе.

Чтобы получить доступ к API Fluent, переопределите метод 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 чанжедисплайнаме , чтобы сформировать шаблон миграции, чтобы применить эти изменения к базе данных.
  • Выполните команду обновления базы данных , чтобы применить новую миграцию к базе данных.

Столбец DisplayName теперь переименован в display_name:

Schema With Display Name Renamed

Сводка

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