Код сначала для существующей базы данных

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

Необходимые условия

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

Вам также потребуется версия 6.1 (или более поздняя) установленных средств Entity Framework для Visual Studio . Сведения об установке последней версии средств Entity Framework см. в статье Get Entity Framework Framework .

1. Создание существующей базы данных

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

Давайте пойдем вперед и создадим базу данных.

  • Запустите Visual Studio

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

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

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

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

  • Подключитесь к экземпляру LocalDB и введите blogging в качестве имени базы данных

    Подключение LocalDB

  • Нажмите кнопку "ОК ", и вам будет предложено создать новую базу данных, нажмите кнопку "Да"

    Диалоговое окно создания базы данных

  • Новая база данных появится в обозревателе серверов, щелкните его правой кнопкой мыши и выберите новый запрос

  • Скопируйте следующий SQL в новый запрос, а затем щелкните правой кнопкой мыши запрос и выберите "Выполнить".

CREATE TABLE [dbo].[Blogs] (
    [BlogId] INT IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (200) NULL,
    [Url]  NVARCHAR (200) NULL,
    CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);

CREATE TABLE [dbo].[Posts] (
    [PostId] INT IDENTITY (1, 1) NOT NULL,
    [Title] NVARCHAR (200) NULL,
    [Content] NTEXT NULL,
    [BlogId] INT NOT NULL,
    CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
    CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
);

INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')

INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')

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

Чтобы упростить работу, мы создадим базовое консольное приложение, использующее Code First для доступа к данным:

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

 

3. Модель обратного инженера

Мы будем использовать инструменты Entity Framework для Visual Studio, чтобы помочь нам создать исходный код для сопоставления с базой данных. Эти средства просто создают код, который можно также ввести вручную, если вы предпочитаете.

  • Проект —> добавление нового элемента...

  • Выберите данные из меню слева, а затем ADO.NET модель данных сущности

  • Введите bloggingContext в качестве имени и нажмите кнопку "ОК"

  • Откроется Мастер создания модели данных сущностей

  • Выберите код сначала из базы данных и нажмите кнопку "Далее"

    Мастер One CFE

  • Выберите подключение к базе данных, созданной в первом разделе, и нажмите кнопку "Далее".

    Мастер Two CFE

  • Установите флажок рядом с таблицами, чтобы импортировать все таблицы и нажмите кнопку "Готово"

    Wizard Three CFE

После завершения процесса обратного проектирования в проект будет добавлено несколько элементов, давайте посмотрим, что добавлено.

Файл конфигурации

Файл App.config добавлен в проект, этот файл содержит строку подключения к существующей базе данных.

<connectionStrings>
  <add  
    name="BloggingContext"  
    connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"  
    providerName="System.Data.SqlClient" />
</connectionStrings>

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

Производный контекст

В проект добавлен класс BloggingContext . Контекст представляет сеанс с базой данных, позволяя запрашивать и сохранять данные. Контекст предоставляет DbSet<TEntity> для каждого типа в нашей модели. Вы также заметите, что конструктор по умолчанию вызывает базовый конструктор с помощью синтаксиса name= . Это сообщает Code First, что строка подключения, используемая для этого контекста, должна быть загружена из файла конфигурации.

public partial class BloggingContext : DbContext
    {
        public BloggingContext()
            : base("name=BloggingContext")
        {
        }

        public virtual DbSet<Blog> Blogs { get; set; }
        public virtual DbSet<Post> Posts { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }

При использовании строки подключения в файле конфигурации всегда следует использовать синтаксис name= . Это гарантирует, что если строка подключения отсутствует, Entity Framework выдаст ошибку вместо создания новой базы данных по соглашению.

Классы модели

Наконец, в проект также добавлен класс Blog и Post . Это классы домена, составляющие нашу модель. Вы увидите, что заметки к данным применяются к классам, чтобы указать конфигурацию, в которой соглашения Code First не соответствуют структуре существующей базы данных. Например, вы увидите заметку StringLength на Blog.Name и Blog.Url , так как у них максимальная длина 200 в базе данных (по умолчанию code First используется максимальная длина, поддерживаемая поставщиком базы данных — nvarchar(max) в SQL Server.

public partial class Blog
{
    public Blog()
    {
        Posts = new HashSet<Post>();
    }

    public int BlogId { get; set; }

    [StringLength(200)]
    public string Name { get; set; }

    [StringLength(200)]
    public string Url { get; set; }

    public virtual ICollection<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:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...

 

Что делать, если моя база данных изменяется?

Мастер «Code First to Database» предназначен для того, чтобы создать начальный набор классов, что вы можете затем настроить и изменять. Если схема базы данных изменяется, можно изменить классы вручную или выполнить ещё одно обратное проектирование, чтобы перезаписать классы.

Использование миграции Code First для существующей базы данных

Если вы хотите использовать миграцию code First Migrations с существующей базой данных, см. статью Code First Migrations to a existing database.

Сводка

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