Работа с SQL Server LocalDB

Rick Anderson

Класс ApplicationDbContext решает задачу соединения с БД и передачи объекта Movie``в записиБД. БД контекст регистрируется с помощью контейнера :doc:`внедрения зависимостей </fundamentals/dependency-injection>` в методе ``ConfigureServices класса Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Конфигурационная система ASP.NET Core считывает ConnectionString. При локальной разработке она получает строку соединения из файла appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-MvcMovie-4ae3798a;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "IncludeScopes": false,

Когда вы разворачиваете приложение на тестовом или производственном сервере, то можете использовать переменную среды или другой подход, чтобы настроить строку соединения к реальному SQL Server. См. Конфигурация .

SQL Server Express LocalDB

LocalDB - это упрощенная версия SQL Server Express Database Engine, которая предназначена для разработки. LocalDB запускается по требованию и работает в режиме пользователя. По умолчанию LocalDB создает файлы “*.mdf” в директории C:/Users/<user>.

  • В меню View откройте SQL Server Object Explorer (SSOX).
../../_images/ssox1.png
  • Кликните правой клавишей мышки по таблице Movie > View Designer
../../_images/design.png ../../_images/dv.png

Обратите внимание на значок ключа рядом с ID. По умолчанию EF сделает свойство ID первичным ключом.

  • Кликните правой клавишей мышки по таблице Movie > View Data
../../_images/ssox2.png ../../_images/vd22.png

Заполнение БД

Создайте новый класс с именем SeedData в папке Models. Замените сгенерированный код следующим:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using System;
using System.Linq;

namespace MvcMovie.Models
{
    public static class SeedData
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new ApplicationDbContext(
                serviceProvider.GetRequiredService<DbContextOptions<ApplicationDbContext>>()))
            {
                // Look for any movies.
                if (context.Movie.Any())
                {
                    return;   // DB has been seeded
                }

                context.Movie.AddRange(
                     new Movie
                     {
                         Title = "When Harry Met Sally",
                         ReleaseDate = DateTime.Parse("1989-1-11"),
                         Genre = "Romantic Comedy",
                         Price = 7.99M
                     },

                     new Movie
                     {
                         Title = "Ghostbusters ",
                         ReleaseDate = DateTime.Parse("1984-3-13"),
                         Genre = "Comedy",
                         Price = 8.99M
                     },

                     new Movie
                     {
                         Title = "Ghostbusters 2",
                         ReleaseDate = DateTime.Parse("1986-2-23"),
                         Genre = "Comedy",
                         Price = 9.99M
                     },

                   new Movie
                   {
                       Title = "Rio Bravo",
                       ReleaseDate = DateTime.Parse("1959-4-15"),
                       Genre = "Western",
                       Price = 3.99M
                   }
                );
                context.SaveChanges();
            }
        }
    }
}

Если в БД уже есть ролики, то возвращается инициализатор заполнения.

if (context.Movie.Any())
{
    return;   // DB has been seeded.
}

Добавьте инициализатор заполнения в конец метода Configure класса Startup.cs:

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
    #endregion

    SeedData.Initialize(app.ApplicationServices);
}
// End of Configure.


Протестируйте приложение

  • Удалите все записи из БД. Вы можете сделать это, нажав ссылки delete в браузере или из SSOX.
  • Проведите инициализацию (вызовите методы в классе Startup), чтобы запустился метод, заполняющий БД. IIS Express должен быть остановлен и перезапущен. Вы можете сделать это вот так:
    • Кликните правой клавишей мышки по системной иконке IIS Express в оповещениях и нажмите Exit или Stop Site

../../_images/iisExIcon.png

../../_images/stopIIS.png

  • Если VS запущена в режиме без отладки, нажмите F5, чтобы запустить режим отладки
  • Если VS запущена в режиме с отладкой, остановите отладчик и нажмите ^F5

Примечание

Если БД не инициализируется, поставьте точку останова на строке if (context.Movie.Any()) и начните отладку.

../../_images/dbg.png

Результат.

../../_images/m55.png
Поделись хорошей новостью с друзьями!
Следи за новостями!