Del 5, arbeta med en databas i en ASP.NET Core MVC-app
Varning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. Den aktuella versionen finns i .NET 9-versionen av denna artikel.
Viktig
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.
Av Rick Anderson och Jon P Smith.
MvcMovieContext
-objektet hanterar uppgiften att ansluta till databasen och mappa Movie
objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i Program.cs
-filen:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));
ASP.NET Core Configuration-systemet läser ConnectionString
-nyckeln. För lokal utveckling hämtar den anslutningssträngen från appsettings.json
-filen:
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-4ebefa10-de29-4dea-b2ad-8a8dc6bcf374;Trusted_Connection=True;MultipleActiveResultSets=true"
}
Varning
Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.
SQL Server Express LocalDB
LocalDB:
- Är en lätt version av SQL Server Express Database Engine, installerad som standard med Visual Studio.
- Startar på begäran med hjälp av en anslutningssträng.
- Är inriktat på programutveckling. Den körs i användarläge, så det finns ingen komplex konfiguration.
- Som standard skapas .mdf filer i katalogen C:/Users/{user}.
Granska databasen
Öppna SQL Server Object Explorer (SSOX) på menyn Visa.
Högerklicka på tabellen Movie
(dbo.Movie
) > View Designer
Observera nyckelikonen bredvid ID
. Som standard gör EF en egenskap med namnet ID
den primära nyckeln.
Högerklicka på tabellen Movie
> Visa data
Initiera databasen
Skapa en ny klass med namnet SeedData
i mappen Models. Ersätt den genererade koden med följande:
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();
}
}
}
Om det finns några filmer i databasen returneras startvärdet och inga filmer läggs till.
if (context.Movie.Any())
{
return; // DB has been seeded.
}
Lägg till startvärdet för seed
Ersätt innehållet i Program.cs
med följande kod. Den nya koden är markerad.
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));
// 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.UseRouting();
app.UseAuthorization();
app.MapStaticAssets();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Ta bort alla poster i databasen. Du kan göra detta med borttagningslänkarna i webbläsaren eller från SSOX.
Testa appen. Tvinga appen att initiera och anropa koden i filen Program.cs
så att seed-metoden körs. Om du vill framtvinga initiering stänger du kommandotolksfönstret som Visual Studio öppnade och startar om genom att trycka på Ctrl+F5.
Appen visar de data som har matats in.
MvcMovieContext
-objektet hanterar uppgiften att ansluta till databasen och mappa Movie
objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i Program.cs
-filen:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));
ASP.NET Core Configuration-systemet läser ConnectionString
-nyckeln. För lokal utveckling hämtar den anslutningssträngen från appsettings.json
-filen:
"ConnectionStrings": {
"MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}
Varning
Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.
SQL Server Express LocalDB
LocalDB:
- Är en lätt version av SQL Server Express Database Engine, installerad som standard med Visual Studio.
- Startar på begäran med hjälp av en anslutningssträng.
- Är avsett för programutveckling. Den körs i användarläge, så det finns ingen komplex konfiguration.
- Som standard skapas .mdf filer i katalogen C:/Users/{user}.
Granska databasen
Öppna SQL Server Object Explorer (SSOX) på menyn Visa.
Högerklicka på tabellen Movie
(dbo.Movie
) > View Designer
Observera nyckelikonen bredvid ID
. Som standard gör EF en egenskap med namnet ID
den primära nyckeln.
Högerklicka på tabellen Movie
> Visa data
Seed databasen
Skapa en ny klass med namnet SeedData
i mappen Models. Ersätt den genererade koden med följande:
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();
}
}
}
Om det finns några filmer i databasen returneras startvärdet och inga filmer läggs till.
if (context.Movie.Any())
{
return; // DB has been seeded.
}
Lägg till startvärde för frö
Ersätt innehållet i Program.cs
med följande kod. Den nya koden är markerad.
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(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();
Ta bort alla poster i databasen. Du kan göra detta med borttagningslänkarna i webbläsaren eller från SSOX.
Testa appen. Tvinga appen att initiera och anropa koden i filen Program.cs
så att seed-metoden körs. Om du vill framtvinga initiering stänger du kommandotolksfönstret som Visual Studio öppnade och startar om genom att trycka på Ctrl+F5.
Appen visar de data som har hämtats.
MvcMovieContext
-objektet hanterar uppgiften att ansluta till databasen och mappa Movie
objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i Program.cs
-filen:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));
ASP.NET Core Configuration-systemet läser ConnectionString
-nyckeln. För lokal utveckling hämtar den anslutningssträngen från appsettings.json
-filen:
"ConnectionStrings": {
"MvcMovieContext": "Data Source=MvcMovieContext-ea7a4069-f366-4742-bd1c-3f753a804ce1.db"
}
Varning
Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.
SQL Server Express LocalDB
LocalDB:
- Är en lätt version av SQL Server Express Database Engine, installerad som standard med Visual Studio.
- Startar på begäran med hjälp av en anslutningssträng.
- Är inriktad på programutveckling. Den körs i användarläge, så det finns ingen komplex konfiguration.
- Som standard skapas .mdf filer i katalogen C:/Users/{user}.
Granska databasen
Öppna SQL Server Object Explorer (SSOX) på menyn Visa.
Högerklicka på tabellen Movie
(dbo.Movie
) > View Designer
Observera nyckelikonen bredvid ID
. Som standard gör EF en egenskap med namnet ID
den primära nyckeln.
Högerklicka på tabellen Movie
> Visa data
Seed databasen
Skapa en ny klass med namnet SeedData
i mappen Models. Ersätt den genererade koden med följande:
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();
}
}
}
Om det finns några filmer i databasen avslutas initialiseringen och inga filmer läggs till.
if (context.Movie.Any())
{
return; // DB has been seeded.
}
<ett namn=snippet_"si">
Lägg till initierare för seed
Ersätt innehållet i Program.cs
med följande kod. Den nya koden är markerad.
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(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();
Ta bort alla poster i databasen. Du kan göra detta med borttagningslänkarna i webbläsaren eller från SSOX.
Testa appen. Tvinga appen att initiera och anropa koden i filen Program.cs
så att seed-metoden körs. Om du vill framtvinga initiering stänger du kommandotolksfönstret som Visual Studio öppnade och startar om genom att trycka på Ctrl+F5.
Appen visar den försådda datan.
MvcMovieContext
-objektet hanterar uppgiften att ansluta till databasen och mappa Movie
objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i Program.cs
-filen:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext")));
ASP.NET Core Configuration-systemet läser ConnectionString
-nyckeln. För lokal utveckling hämtar den anslutningssträngen från appsettings.json
-filen:
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-7dc5;Trusted_Connection=True;MultipleActiveResultSets=true"
}
Varning
Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.
SQL Server Express LocalDB
LocalDB:
- Är en lätt version av SQL Server Express Database Engine, installerad som standard med Visual Studio.
- Startar på begäran med hjälp av en anslutningssträng.
- Är avsedd för programutveckling. Den körs i användarläge, så det finns ingen komplex konfiguration.
- Som standard skapas .mdf filer i katalogen C:/Users/{user}.
Seed databasen
Skapa en ny klass med namnet SeedData
i mappen Models. Ersätt den genererade koden med följande:
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();
}
}
}
}
Om det finns några filmer i databasen returneras startvärdet och inga filmer läggs till.
if (context.Movie.Any())
{
return; // DB has been seeded.
}
Lägg till seed-initialiserare
Ersätt innehållet i Program.cs
med följande kod. Den nya koden är markerad.
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MvcMovie.Data;
using MvcMovie.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(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();
Ta bort alla poster i databasen. Du kan göra detta med borttagningslänkarna i webbläsaren eller från SSOX.
Testa appen. Tvinga appen att initiera och anropa koden i filen Program.cs
så att seed-metoden körs. Om du vill framtvinga initiering stänger du kommandotolksfönstret som Visual Studio öppnade och startar om genom att trycka på Ctrl+F5.
Appen visar de data som har hämtats.
MvcMovieContext
-objektet hanterar uppgiften att ansluta till databasen och mappa Movie
objekt till databasposter. Databaskontexten registreras med containern Dependency Injection i metoden ConfigureServices
i filen Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}
ASP.NET Core Configuration-systemet läser ConnectionString
-nyckeln. För lokal utveckling hämtar den anslutningssträngen från appsettings.json
-filen:
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}
Varning
Den här artikeln använder en lokal databas som inte kräver att användaren autentiseras. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för distribuerade test- och produktionsappar finns i Säkra autentiseringsflöden.
SQL Server Express LocalDB
LocalDB:
- Är en lätt version av SQL Server Express Database Engine, installerad som standard med Visual Studio.
- Startar på begäran med hjälp av en anslutningssträng.
- Är avsedd för programutveckling. Den körs i användarläge, så det finns ingen komplex konfiguration.
- Som standard skapas .mdf filer i katalogen C:/Users/{user}.
Granska databasen
Öppna SQL Server Object Explorer (SSOX) på menyn Visa.
Högerklicka på tabellen Movie
> View Designer
Observera nyckelikonen bredvid ID
. Som standard gör EF en egenskap med namnet ID
den primära nyckeln.
Högerklicka på tabellen Movie
> Visa data
Seed databasen
Skapa en ny klass med namnet SeedData
i mappen Models. Ersätt den genererade koden med följande:
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();
}
}
}
}
Om databasen innehåller några filmer, returnerar grundinitieraren och inga filmer läggs till.
if (context.Movie.Any())
{
return; // DB has been seeded.
}
Lägg till initieraren för seed
Ersätt innehållet i Program.cs
med följande kod:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MvcMovie.Data;
using MvcMovie.Models;
using System;
namespace MvcMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Testa appen.
Ta bort alla poster i databasen. Du kan göra detta med borttagningslänkarna i webbläsaren eller från SSOX.
Tvinga appen att initiera och anropa metoderna i klassen Startup
så att seed-metoden körs. För att framtvinga initiering måste IIS Express stoppas och startas om. Du kan göra detta med någon av följande metoder:
Högerklicka på ikonen för IIS Express-systemfältet i meddelandefältet och tryck på Avsluta eller Stoppa webbplats:
- Om du körde VS i icke-felsökningsläge trycker du på F5 för att köra i felsökningsläge
- Om du körde VS i felsökningsläge stoppar du felsökningsprogrammet och trycker på F5
Appen visar de data som har hämtats.
ASP.NET Core