Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core 7
Для взаимодействия с базой данных для контекста данных должна быть определена конфигурация подключения. Для ее установки можно применять два способа:
Переопределение у класса контекста данных метода OnConfiguring()
Передача конфигурации в конструктор базового класса DbContext
В предыдущих темах использовался первый метод. Например:
public class ApplicationContext : DbContext { public DbSet<User> Users { get; set; } public ApplicationContext() { Database.EnsureCreated(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;"); } }
В этот метод передается объект DbContextOptionsBuilder, который позволяет создать параметры подключения. Для их создания вызывается метод UseSqlServer
,
в который передается строка подключения.
Строка подключения разбивается на несколько частей:
Server: название сервера. В данном случае используется специальный движок MS SQL Server - localdb, который предназначен
специально для нужд разработки. Для полноценного MS SQL Server Express этот параметр, как правило, имеет значение .\SQLEXPRESS
Database: название файла базы данных без расширения mdf
Trusted_Connection: устанавливает проверку подлинности
Это способ вполне рабочий и может использоваться.
Второй способ предполагает передачу в конструктор базового класса объекта DbContextOptions, который инкапсулирует параметры конфигурации. Для применения этого способа изменим класс контекста следующим образом:
using Microsoft.EntityFrameworkCore; namespace HelloApp { public class ApplicationContext : DbContext { public DbSet<User> Users { get; set; } public ApplicationContext(DbContextOptions<ApplicationContext> options) :base(options) { Database.EnsureCreated(); } } }
Тогда мы могли бы использовать класс контекста следующим образом:
using Microsoft.EntityFrameworkCore; using System; using System.Linq; namespace HelloApp { public class Program { public static void Main(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<ApplicationContext>(); var options = optionsBuilder .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;") .Options; using (ApplicationContext db = new ApplicationContext(options)) { var users = db.Users.ToList(); foreach (User u in users) Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}"); } Console.Read(); } } }
Здесь опять же применяется метод UseSqlServer класса DbContextOptionsBuilder для создания конфигурации по той же строке подключения. Только результат этой операции - объект DbContextOptions затем передается в контекст данных. А контекст данных далее передает этот параметр в конструктор базового класса.
Оба выше представленных способа вполне работают, однако в том определении, в котором они представлены, они имеют один недостаток - строка подключения жестко определена в коде C#. И было бы неплохо, если бы она была бы определена в каком-нибудь внешнем файле подключения, где мы ее могли бы поменять без перекомпиляции приложения.
Для этого добавим в проект новый элемент JSON File, который назовем appsettings.json:
Определим в этом файле следующий код:
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=helloappdb;Trusted_Connection=True;" } }
Здесь опять же определена наша строка подключения.
Чтобы ее использовать, нам надо добавить в проект через Nuget пакет: Microsoft.Extensions.Configuration.Json. Этот пакет специально предназначен для работы с конфигурацией в формате json.
После добавления файла в Visual Studio не забудьте у него установить найстройку копирования в каталог приложения
Далее для работы с БД в классе Program определим следующий код:
using System; using System.Linq; using Microsoft.Extensions.Configuration; using Microsoft.EntityFrameworkCore; using System.IO; namespace HelloApp { public class Program { public static void Main(string[] args) { var builder = new ConfigurationBuilder(); // установка пути к текущему каталогу builder.SetBasePath(Directory.GetCurrentDirectory()); // получаем конфигурацию из файла appsettings.json builder.AddJsonFile("appsettings.json"); // создаем конфигурацию var config = builder.Build(); // получаем строку подключения string connectionString = config.GetConnectionString("DefaultConnection"); var optionsBuilder = new DbContextOptionsBuilder<ApplicationContext>(); var options = optionsBuilder .UseSqlServer(connectionString) .Options; using (ApplicationContext db = new ApplicationContext(options)) { var users = db.Users.ToList(); foreach (User u in users) { Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}"); } } Console.Read(); } } }
Для создания конфигурации применяется класс ConfigurationBuilder. Метод AddJsonFile()
добавляет все настройки из файла конфигурации.
С помощью метода Build()
создается объект конфигурации, из которого мы можем получить строку подключения:
string connectionString = config.GetConnectionString("DefaultConnection");
Для получения строки подключения используется ее имя - "DefaultConnection", которое указано в appsettings.json.
В остальном работа с контекстом данных будет протекать также.