Code First в новой базе данныхCode First to a New Database

В этом пошаговом руководстве видео и пошаговые познакомят вас с разработки Code First, предназначенные для новой базы данных.This video and step-by-step walkthrough provide an introduction to Code First development targeting a new database. Этот сценарий включает предназначенные для базы данных, которая не существует и Code First создаст пустую базу данных, Code First добавит новые таблицы для.This scenario includes targeting a database that doesn’t exist and Code First will create, or an empty database that Code First will add new tables to. Во-первых, код позволяет определить модель с помощью C## или классам VB.Net.Code First allows you to define your model using C# or VB.Net classes. Дополнительная настройка при необходимости выполняются с помощью атрибутов для классов и свойств или с помощью текучего API.Additional configuration can optionally be performed using attributes on your classes and properties or by using a fluent API.

Просмотреть видеоWatch the video

Этот видеоролик представляет собой введение разработки Code First, предназначенные для новой базы данных.This video provides an introduction to Code First development targeting a new database. Этот сценарий включает предназначенные для базы данных, которая не существует и Code First создаст пустую базу данных, Code First добавит новые таблицы для.This scenario includes targeting a database that doesn’t exist and Code First will create, or an empty database that Code First will add new tables to. Во-первых, код позволяет определить модель с помощью классов C# или VB.Net.Code First allows you to define your model using C# or VB.Net classes. Дополнительная настройка при необходимости выполняются с помощью атрибутов для классов и свойств или с помощью текучего API.Additional configuration can optionally be performed using attributes on your classes and properties or by using a fluent API.

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

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

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

Для выполнения этого пошагового руководства необходимо иметь по крайней мере Visual Studio 2010 или Visual Studio 2012.You will need to have at least Visual Studio 2010 or Visual Studio 2012 installed to complete this walkthrough.

Если вы используете Visual Studio 2010, также необходимо будет иметь NuGet установлен.If you are using Visual Studio 2010, you will also need to have NuGet installed.

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

Для простоты мы собираемся создать простое консольное приложение, которое использует Code First для осуществления доступа к данным.To keep things simple we’re going to build a basic console application that uses Code First to perform data access.

  • Открытие Visual StudioOpen Visual Studio
  • Файл —> Новинка —> проекта...File -> New -> Project…
  • Выберите Windows в меню слева и консольного приложенияSelect Windows from the left menu and Console Application
  • Введите CodeFirstNewDatabaseSample как имяEnter CodeFirstNewDatabaseSample as the name
  • Нажмите кнопку ОКSelect OK

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

Давайте определим очень простую модель с помощью классов.Let’s define a very simple model using classes. Мы просто определяем их в файл Program.cs, но в случае реального приложения должно разбивать классы out в отдельных файлах и, возможно, отдельный проект.We’re just defining them in the Program.cs file but in a real world application you would split your classes out into separate files and potentially a separate project.

Ниже определении класса программы в файле Program.cs добавьте следующие два класса.Below the Program class definition in Program.cs add the following two classes.

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) виртуальный.You’ll notice that we’re making the two navigation properties (Blog.Posts and Post.Blog) virtual. Это позволяет функции отложенной загрузки в Entity Framework.This enables the Lazy Loading feature of Entity Framework. Отложенная загрузка означает, что содержимое этих свойств будет автоматически загружаться из базы данных при попытке доступа к ним.Lazy Loading means that the contents of these properties will be automatically loaded from the database when you try to access them.

3. Создайте контекст3. Create a Context

Пришло время для определения производного контекста, который представляет сеанс подключения с базой данных, позволяет запрашивать и сохранять данные.Now it’s time to define a derived context, which represents a session with the database, allowing us to query and save data. Мы определяем контекст, который является производным от System.Data.Entity.DbContext и предоставляет типизированный DbSet<TEntity> для каждого класса в нашей модели.We define a context that derives from System.Data.Entity.DbContext and exposes a typed DbSet<TEntity> for each class in our model.

Теперь мы запускаем следует использовать типы из Entity Framework, поэтому нам нужно добавить пакет EntityFramework NuGet.We’re now starting to use types from the Entity Framework so we need to add the EntityFramework NuGet package.

  • Проект —> управление пакетами NuGet...Project –> Manage NuGet Packages… Примечание: Если у вас нет управление пакетами NuGet...Note: If you don’t have the Manage NuGet Packages… параметр, необходимо установить последнюю версию NuGetoption you should install the latest version of NuGet
  • Выберите Online вкладкуSelect the Online tab
  • Выберите EntityFramework пакетаSelect the EntityFramework package
  • Нажмите кнопку установкиClick Install

Добавить с помощью инструкции для System.Data.Entity в верхней части Program.cs.Add a using statement for System.Data.Entity at the top of Program.cs.

using System.Data.Entity;

Под Post класса в файле Program.cs добавьте следующие производного контекста.Below the Post class in Program.cs add the following derived context.

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

Ниже приведен полный листинг что еще теперь должно содержать файл Program.cs.Here is a complete listing of what Program.cs should now contain.

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; }
    }
}

Это весь код, который необходимо запустить, хранения и извлечения данных.That is all the code we need to start storing and retrieving data. Очевидно, что есть довольно много происходит за кулисами, и мы рассмотрим краткий обзор, что в момент, однако сначала посмотрим на это в действии.Obviously there is quite a bit going on behind the scenes and we’ll take a look at that in a moment but first let’s see it in action.

4. Чтение и запись данных4. Reading & Writing Data

Реализуйте метод Main в файле Program.cs, как показано ниже.Implement the Main method in Program.cs as shown below. Этот код создает новый экземпляр класса наш контекст, а затем использует его для вставки нового блога.This code creates a new instance of our context and then uses it to insert a new Blog. Затем он использует запрос LINQ для извлечения из базы данных, представлены в алфавитном порядке по названию все блоги.Then it uses a LINQ query to retrieve all Blogs from the database ordered alphabetically by Title.

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();
        }
    }
}

Теперь можно запустить приложение и протестировать его.You can now run the application and test it out.

Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
ADO.NET Blog
Press any key to exit...

Где мои данные?Where’s My Data?

По соглашению DbContext автоматически создала базу данных.By convention DbContext has created a database for you.

  • Если локальный экземпляр SQL Express (устанавливается по умолчанию вместе с Visual Studio 2010) затем Code First базы данных на этом экземпляре создаетсяIf a local SQL Express instance is available (installed by default with Visual Studio 2010) then Code First has created the database on that instance
  • Если SQL Express недоступен, то Code First будет попробуйте и использовать LocalDB (устанавливается по умолчанию с помощью Visual Studio 2012)If SQL Express isn’t available then Code First will try and use LocalDB (installed by default with Visual Studio 2012)
  • База данных называется после полное имя производного контекста, в нашем случае это CodeFirstNewDatabaseSample.BloggingContextThe database is named after the fully qualified name of the derived context, in our case that is CodeFirstNewDatabaseSample.BloggingContext

Это просто соглашения по умолчанию существуют различные способы изменения базы данных, который использует Code First, Дополнительные сведения можно найти в как DbContext обнаруживает модель и подключение к базе данных раздела.These are just the default conventions and there are various ways to change the database that Code First uses, more information is available in the How DbContext Discovers the Model and Database Connection topic. Можно подключиться к этой базе данных, с помощью обозревателя серверов в Visual StudioYou can connect to this database using Server Explorer in Visual Studio

  • Представление —> обозревателя серверовView -> Server Explorer

  • Щелкните правой кнопкой мыши подключения к данным и выберите добавить соединение...Right click on Data Connections and select Add Connection…

  • Если вы не подключились к базе данных с помощью обозревателя сервера прежде, чем вам потребуется выбрать в качестве источника данных Microsoft SQL ServerIf you haven’t connected to a database from Server Explorer before you’ll need to select Microsoft SQL Server as the data source

    Выберите источник данных

  • Подключение к LocalDB или SQL Express, в зависимости от того, какой из них установкиConnect to either LocalDB or SQL Express, depending on which one you have installed

Теперь можно проверить, Code First создает схему.We can now inspect the schema that Code First created.

Начальный схемы

Классы для включения в модель, просмотрев свойства DbSet, которые мы определили работы DbContext.DbContext worked out what classes to include in the model by looking at the DbSet properties that we defined. Затем набор соглашения Code First, по умолчанию используется для определения имен таблиц и столбцов, определения типов данных, найти первичные ключи и т. д.It then uses the default set of Code First conventions to determine table and column names, determine data types, find primary keys, etc. Далее в этом пошаговом руководстве мы рассмотрим, как можно переопределить эти соглашения.Later in this walkthrough we’ll look at how you can override these conventions.

5. Изменения модели5. Dealing with Model Changes

Теперь пора внести некоторые изменения в нашей модели, когда мы внести эти изменения, необходимо также обновить схему базы данных.Now it’s time to make some changes to our model, when we make these changes we also need to update the database schema. Для этого мы собираемся использовать средство Code First Migrations и миграции для краткости.To do this we are going to use a feature called Code First Migrations, or Migrations for short.

Миграция позволяет нам упорядоченный набор шагов, которые описывают обновление (или понижение) нашей схемы базы данных.Migrations allows us to have an ordered set of steps that describe how to upgrade (and downgrade) our database schema. Каждая из этих действий, известных как миграцию, содержит код, который описывает изменения, применяемые.Each of these steps, known as a migration, contains some code that describes the changes to be applied.

Первым шагом является включение Code First Migrations для наших BloggingContext.The first step is to enable Code First Migrations for our BloggingContext.

  • Средства —> диспетчер пакетов библиотеки -> консоль диспетчера пакетовTools -> Library Package Manager -> Package Manager Console

  • Запустите команду Enable-Migrations в консоли диспетчера пакетов.Run the Enable-Migrations command in Package Manager Console

  • Новая папка миграции был добавлен в наш проект, содержащий два элемента:A new Migrations folder has been added to our project that contains two items:

    • Configuration.cs — этот файл содержит параметры, которые будут использовать миграции для переноса BloggingContext.Configuration.cs – This file contains the settings that Migrations will use for migrating BloggingContext. Нет необходимости изменять что-либо в этом пошаговом руководстве, но Вот где можно указать начальное значение данных, поставщики register для других баз данных, изменяет пространство имен что миграции создаются в и т.д.We don’t need to change anything for this walkthrough, but here is where you can specify seed data, register providers for other databases, changes the namespace that migrations are generated in etc.
    • <Метка времени>_InitialCreate.cs – это первую миграцию, он представляет изменения, которые уже были применены к базы данных, пользоваться не пустую базу данных, который включает в себя блогов и записей таблицы .<timestamp>_InitialCreate.cs – This is your first migration, it represents the changes that have already been applied to the database to take it from being an empty database to one that includes the Blogs and Posts tables. Несмотря на то, что мы позволим Code First автоматически создавать эти таблицы для нас, раз уж мы выбрали для миграций, они были преобразованы в миграции.Although we let Code First automatically create these tables for us, now that we have opted in to Migrations they have been converted into a Migration. Код сначала также записывается в нашей локальной базы данных, что уже был применен такой миграции.Code First has also recorded in our local database that this Migration has already been applied. Метка времени в имени файла используется для сортировки целей.The timestamp on the filename is used for ordering purposes.

    Теперь давайте внести изменения в нашей модели, добавьте в класс блог свойства URL-адреса:Now let’s make a change to our model, add a Url property to the Blog class:

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; }
}
  • Запустите AddUrl Add-Migration команду в консоли диспетчера пакетов.Run the Add-Migration AddUrl command in Package Manager Console. Команда Add-Migration проверяет наличие изменений с момента последнего перехода и формирует шаблоны новой миграции с любыми изменениями, которые находятся.The Add-Migration command checks for changes since your last migration and scaffolds a new migration with any changes that are found. Мы можем дать миграций имени; в этом случае мы называем миграции «AddUrl».We can give migrations a name; in this case we are calling the migration ‘AddUrl’. Шаблонный код говорит, что нам нужно добавить столбец URL-адрес, который может содержать строковые данные, dbo. Таблица блоги.The scaffolded code is saying that we need to add a Url column, that can hold string data, to the dbo.Blogs table. При необходимости, мы может изменить сформированный код, но в данном случае это не обязательно.If needed, we could edit the scaffolded code but that’s not required in this case.
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 команду в консоли диспетчера пакетов.Run the Update-Database command in Package Manager Console. Эта команда применит все незавершенные миграции к базе данных.This command will apply any pending migrations to the database. Миграция это InitialCreate уже был применен, поэтому миграция будет просто применить нашей новой миграции AddUrl.Our InitialCreate migration has already been applied so migrations will just apply our new AddUrl migration. Совет: Можно использовать – Verbose при вызове Update-Database, чтобы увидеть SQL, который выполняется в базе данных.Tip: You can use the –Verbose switch when calling Update-Database to see the SQL that is being executed against the database.

Теперь новый столбец URL-адрес добавляется в блоги таблицу в базе данных:The new Url column is now added to the Blogs table in the database:

Схема с URL-адрес

6. Заметки к данным6. Data Annotations

Пока мы просто позволили EF обнаруживать модели с помощью его соглашения по умолчанию, но будут ли раз, когда наших классов не соответствуют соглашениям об, и нам нужно иметь возможность дальнейшей настройки.So far we’ve just let EF discover the model using its default conventions, but there are going to be times when our classes don’t follow the conventions and we need to be able to perform further configuration. Существует два варианта. Мы рассмотрим заметок к данным в этом разделе, а затем текучего API в следующем разделе.There are two options for this; we’ll look at Data Annotations in this section and then the fluent API in the next section.

  • Добавим к нашей модели пользовательского классаLet’s add a User class to our model
public class User
{
    public string Username { get; set; }
    public string DisplayName { get; set; }
}
  • Необходимо также добавить набор в нашей производного контекстаWe also need to add a set to our derived context
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.»If we tried to add a migration we’d get an error saying “EntityType ‘User’ has no key defined. Define the key for this EntityType.” так как EF не имеет возможности узнать, что имя пользователя должно быть первичный ключ для пользователя.because EF has no way of knowing that Username should be the primary key for User.
  • Мы собираемся теперь использовать заметки к данным, поэтому нам нужно добавить с помощью оператора в верхней части Program.csWe’re going to use Data Annotations now so we need to add a using statement at the top of Program.cs
using System.ComponentModel.DataAnnotations;
  • Теперь Добавление заметок свойство Username, чтобы определить, что он является первичным ключомNow annotate the Username property to identify that it is the primary key
public class User
{
    [Key]
    public string Username { get; set; }
    public string DisplayName { get; set; }
}
  • Используйте AddUser Add-Migration команду, чтобы сформировать шаблон миграции для применения этих изменений в базу данныхUse the Add-Migration AddUser command to scaffold a migration to apply these changes to the database
  • Запустите Update-Database команду, чтобы применить созданную миграцию к базе данныхRun the Update-Database command to apply the new migration to the database

Теперь новая таблица добавляется в базу данных:The new table is now added to the database:

Схема с пользователями

Приведен полный список заметок, поддерживаемых EF.The full list of annotations supported by EF is:

7. Текучий API7. Fluent API

В предыдущем разделе мы рассмотрели использование заметок к данным для дополнения или переопределить, что была обнаружена по соглашению.In the previous section we looked at using Data Annotations to supplement or override what was detected by convention. Другой способ настройки модели — с помощью Code First fluent API.The other way to configure the model is via the Code First fluent API.

Большинство конфигураций модели можно сделать с помощью простых данных заметок.Most model configuration can be done using simple data annotations. Текучий API — это более сложных способ указания модели конфигурации, который охватывает все, что заметки к данным можно делать в дополнение к некоторые более сложные конфигурации, недоступные в заметки к данным.The fluent API is a more advanced way of specifying model configuration that covers everything that data annotations can do in addition to some more advanced configuration not possible with data annotations. Заметки к данным и текучий API могут использоваться совместно.Data annotations and the fluent API can be used together.

Для доступа к fluent API переопределить метод OnModelCreating в DbContext.To access the fluent API you override the OnModelCreating method in DbContext. Предположим, мы хотели бы переименовать столбец, который User.DisplayName хранится в для отображения_имя.Let’s say we wanted to rename the column that User.DisplayName is stored in to display_name.

  • Переопределите метод OnModelCreating на BloggingContext следующим кодомOverride the OnModelCreating method on BloggingContext with the following code
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");
    }
}
  • Используйте ChangeDisplayName Add-Migration команду, чтобы сформировать шаблон миграции для применения этих изменений в базу данных.Use the Add-Migration ChangeDisplayName command to scaffold a migration to apply these changes to the database.
  • Запустите Update-Database команду, чтобы применить созданную миграцию к базе данных.Run the Update-Database command to apply the new migration to the database.

Теперь в столбце DisplayName переименовывается для отображения_имя:The DisplayName column is now renamed to display_name:

Схема с отображаемым именем переименован

СводкаSummary

В этом пошаговом руководстве мы рассмотрели шаблона разработки Code First с помощью новой базы данных.In this walkthrough we looked at Code First development using a new database. Мы определена модель, с помощью классов, затем использовать эту модель для создания базы данных и хранения и извлечения данных.We defined a model using classes then used that model to create a database and store and retrieve data. После создания базы данных мы использовали Code First Migrations для изменения схемы, как наша модель развитие.Once the database was created we used Code First Migrations to change the schema as our model evolved. Мы также увидели, как настроить модель с помощью заметок к данным и Fluent API.We also saw how to configure a model using Data Annotations and the Fluent API.