MvcMovieContext
객체는 데이터베이스에 연결하고 Movie
객체를 데이터베이스 레코드에 매핑하는 작업을 처리합니다. 데이터베이스 컨텍스트는 Program.cs
파일에서 종속성 주입 컨테이너에 등록됩니다:
Visual Studio Code / Visual Studio for Mac
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("MvcMovieContext")));
ASP.NET Core 구성 시스템은 ConnectionString
키를 읽습니다. 로컬 개발의 경우, appsettings.json
파일에서 연결 문자열을 가져옵니다:
"ConnectionStrings": {
"MvcMovieContext": "Data Source=MvcMovie.db"
}
앱이 테스트 또는 프로덕션 서버에 배포될 때, 환경 변수를 사용하여 프로덕션 SQL Server에 대한 연결 문자열을 설정할 수 있습니다. 자세한 내용은 구성을 참조하세요.
Visual Studio Code / Visual Studio for Mac
SQLite 웹사이트에서는 다음과 같이 설명합니다:
SQLite는 자체 포함, 고신뢰성, 임베디드, 기능이 풍부한 공개 도메인 SQL 데이터베이스 엔진입니다. SQLite는 세계에서 가장 많이 사용되는 데이터베이스 엔진입니다.
SQLite 데이터베이스를 관리하고 보기 위한 많은 서드파티 도구를 다운로드할 수 있습니다. 아래 이미지는 DB Browser for SQLite에서 가져온 것입니다. 선호하는 SQLite 도구가 있다면, 해당 도구의 장점을 댓글로 남겨주세요.
Note
이 튜토리얼에서는 가능한 경우 Entity Framework Core 마이그레이션 기능을 사용합니다. 마이그레이션은 데이터 모델의 변경 사항에 맞게 데이터베이스 스키마를 업데이트합니다. 그러나 마이그레이션은 EF Core 공급자가 지원하는 종류의 변경만 수행할 수 있으며, SQLite 공급자의 기능은 제한적입니다. 예를 들어, 열 추가는 지원되지만 열 제거 또는 변경은 지원되지 않습니다. 열을 제거하거나 변경하는 마이그레이션을 생성하면 ef migrations add
명령은 성공하지만 ef database update
명령은 실패합니다. 이러한 제한 사항으로 인해, 이 튜토리얼에서는 SQLite 스키마 변경에 마이그레이션을 사용하지 않습니다. 대신 스키마가 변경될 때 데이터베이스를 삭제하고 다시 생성합니다.
SQLite 제한 사항에 대한 해결 방법은 테이블의 내용이 변경될 때 테이블을 재구축하는 마이그레이션 코드를 수동으로 작성하는 것입니다. 테이블 재구축에는 다음이 포함됩니다:
- 새 테이블 생성.
- 이전 테이블에서 새 테이블로 데이터 복사.
- 이전 테이블 삭제.
- 새 테이블 이름 변경.
자세한 내용은 다음 리소스를 참조하세요:
Models 폴더에 SeedData
라는 새 클래스를 만듭니다. 생성된 코드를 다음 코드로 교체합니다:
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 MvcMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<MvcMovieContext>>()))
{
// 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-2-12"),
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가 시드되었습니다.
}
Visual Studio Code / Visual Studio for Mac
Program.cs
파일을 다음 강조된 코드로 업데이트합니다:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("MvcMovieContext")));
// Add services to the container.
builder.Services.AddControllersWithViews();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
데이터베이스의 모든 레코드를 삭제하시오.
앱을 테스트합니다. 중지했다가 다시 시작하여 SeedData.Initialize
메서드가 실행되어 데이터베이스를 시드합니다.
앱은 시드된 데이터를 표시합니다.
Part 5, work with a database in an ASP.NET Core MVC app