Sayfalarda öğretici serisinin Razor 4. bölümü
Rick Anderson ve Joe Audette tarafından
Örnek kodu görüntüleme veya indirme (indirme).
RazorPagesMovieContextnesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini ele alır. Veritabanı bağlamı, Startup.cs'deki yönteminde Bağımlılık ConfigureServices Ekleme kapsayıcısı ile kaydedilir:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
ASP.NET Core Yapılandırma sistemi anahtarı ConnectionString okur. Yerel geliştirme için yapılandırma, dosyadan bağlantı dizesini appsettings.json alır.
Oluşturulan bağlantı dizesi aşağıdaki JSON'a benzer:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Uygulama bir test veya üretim sunucusuna dağıtıldığında, bağlantı dizesini bir test veya üretim veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Daha fazla bilgi için bkz. Yapılandırma.
SQL Server Express Localdb
LocalDB, program geliştirme için SQL Server Express veritabanı altyapısının basit bir sürümüdür. LocalDB isteğe bağlı olarak başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı *.mdf dizinde dosyalar C:\Users\<user>\ oluşturur.
Görünüm menüsünden SQL Server Nesne Gezgini (SSOX) öğesini açın.

Tabloya sağ tıklayın ve
MovieGörünüm Tasarımcısı:

simgesinin yanındaki anahtar simgesine
IDdikkatin. Varsayılan olarak EF, birincil anahtar içinIDadlı bir özellik oluşturur.Tabloya sağ tıklayın ve
MovieVerileri Görüntüle'yi seçin:
Veritabanının çekirdeğini oluşturma
Models klasöründe aşağıdaki SeedData kodla adlı yeni bir sınıf oluşturun:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
// 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();
}
}
}
}
Veritabanında film varsa çekirdek başlatıcısı geri döner ve film eklenmez.
if (context.Movie.Any())
{
return;
}
Çekirdek başlatıcıyı ekleme
Program.cs dosyasının içeriğini aşağıdaki kodla değiştirin:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
namespace RazorPagesMovie
{
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>();
});
}
}
Önceki kodda Main yöntemi, aşağıdakini yapacak şekilde değiştirilmiştir:
- Bağımlılık ekleme kapsayıcısı ile bir veritabanı bağlam örneği alır.
- yöntemini
seedData.Initializeçağırarak veritabanı bağlam örneğine geçirme. - Çekirdek yöntemi tamamlandığında bağlamı at. using deyimi bağlamın atılmasından sağlar.
Aşağıdaki özel durum Update-Database çalıştırılmasa oluşur:
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Uygulamayı test etme
Veritabanındaki tüm kayıtları silin. Tarayıcıda veya SSOX'den silme bağlantılarını kullanma
Çekirdek yönteminin çalışması için sınıfındaki yöntemleri çağırarak
Startupuygulamayı başlatmaya zorlar. Başlatmayı zorlamak için IIS Express durdurulmalı ve yeniden başlatılacak. Aşağıdaki yaklaşımlardan herhangi biri ile IIS'yi durdurun ve yeniden başlatın:Bildirim alanında sistem IIS Express simgesine sağ tıklayın ve Siteden Çık veya Siteyi Durdur'u seçin:


Uygulama hata ayıklama modunda çalışmıyorsa, hata ayıklama modunda çalıştırmak için F5 tuşuna basın.
Uygulama hata ayıklama modunda ise hata ayıklayıcıyı durdurun ve F5 tuşuna basın.
Uygulama, çekirdek verileri gösterir:

Ek kaynaklar
Örnek kodu görüntüleme veya indirme (indirme).
RazorPagesMovieContextnesnesi, veritabanına bağlanma ve nesneleri veritabanı kayıtlarına eşleme Movie görevini ele alır. Veritabanı bağlamı, Startup.cs'deki yönteminde Bağımlılık ConfigureServices Ekleme kapsayıcısı ile kaydedilir:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));
}
ASP.NET Core Yapılandırma sistemi anahtarı ConnectionString okur. Yerel geliştirme için yapılandırma, dosyadan bağlantı dizesini appsettings.json alır.
Oluşturulan bağlantı dizesi aşağıdakine benzer:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Uygulama bir test veya üretim sunucusuna dağıtıldığında, bağlantı dizesini bir test veya üretim veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Daha fazla bilgi için bkz. Yapılandırma.
SQL Server Express LocalDB
localdb, program geliştirmeye yönelik SQL Server Express veritabanı altyapısının hafif bir sürümüdür. LocalDB, istek üzerine başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı *.mdf dizinde dosya oluşturur C:\Users\<user>\ .
görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini açın.

Tabloya sağ tıklayıp
MovieGörünüm Tasarımcısı' nı seçin:

Seçeneğinin yanında bulunan anahtar simgesine göz önünde edin ID . Varsayılan olarak, EF birincil anahtar için adlı bir özellik oluşturur ID .
Tabloya sağ tıklayın
Movieve verileri görüntüle' yi seçin:
Veritabanını çekirdek
SeedData Modeller klasöründe aşağıdaki kodla adlı yeni bir sınıf oluşturun:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
using System;
using System.Linq;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
// 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();
}
}
}
}
Veritabanında herhangi bir film varsa, tohum başlatıcısı döner ve hiçbir film eklenmez.
if (context.Movie.Any())
{
return;
}
Tohum başlatıcısı ekleme
Program.cs dosyasının içeriğini aşağıdaki kodla değiştirin:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RazorPagesMovie.Models;
using System;
namespace RazorPagesMovie
{
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>();
});
}
}
Önceki kodda, Main yöntemi aşağıdaki şekilde değiştirilmiştir:
- Bağımlılık ekleme kapsayıcısından bir veritabanı bağlamı örneği alın.
- Yöntemini çağırın
seedData.Initialize, bunu veritabanı bağlamı örneğine geçirerek. - Çekirdek yöntemi tamamlandığında bağlamı atın. Using deyimleri , içeriğin atılmasını sağlar.
Çalıştırılmayan aşağıdaki özel durum oluşur Update-Database :
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Uygulamayı test etme
Veritabanındaki tüm kayıtları silin. Tarayıcıda veya Ssox'ten silme bağlantılarını kullanın.
Sınıfında yöntemleri çağırarak uygulamayı başlamaya zorlayın
Startup, böylece çekirdek yöntemi çalışır. başlatmayı zorlamak için IIS Express durdurulup yeniden başlatılması gerekir. Aşağıdaki yaklaşımlardan biriyle IIS 'yi durdurun ve yeniden başlatın:bildirim alanında IIS Express sistem tepsisi simgesine sağ tıklayın ve çıkış veya siteyi durdur' a dokunun:


- Uygulama hata ayıklamasız modda çalışıyorsa, hata ayıklama modunda çalıştırmak için F5 tuşuna basın.
- Uygulama hata ayıklama modunda olduğunda, hata ayıklayıcıyı durdurun ve F5tuşuna basın.
Uygulama, sağlanan verileri gösterir:

Ek kaynaklar
RazorPagesMovieContextNesnesi veritabanına bağlanma ve Movie nesneleri veritabanı kayıtlarına eşleme görevini işler. Veritabanı bağlamı, program. cs Içindeki bağımlılık ekleme kapsayıcısına kaydedilir:
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using RazorPagesMovie.Data;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
var app = builder.Build();
ASP.NET Core yapılandırma sistemi ConnectionString anahtarı okur. Yerel geliştirme için, yapılandırma bağlantı dizesini appsettings.json dosyadan alır.
Oluşturulan bağlantı dizesi aşağıdaki JSON ile benzerdir:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RazorPagesMovieContext": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesMovieContext-bc;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
Uygulama bir test veya üretim sunucusuna dağıtıldığında, bağlantı dizesini bir test veya üretim veritabanı sunucusuna ayarlamak için bir ortam değişkeni kullanılabilir. Daha fazla bilgi için bkz. yapılandırma.
SQL Server Express LocalDB
localdb, program geliştirmeye yönelik SQL Server Express veritabanı altyapısının hafif bir sürümüdür. LocalDB, istek üzerine başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB veritabanı *.mdf dizinde dosya oluşturur C:\Users\<user>\ .
görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini açın.

Tabloya sağ tıklayıp
MovieGörünüm Tasarımcısı' nı seçin:

Seçeneğinin yanında bulunan anahtar simgesine göz önünde edin
ID. Varsayılan olarak, EF birincil anahtar için adlı bir özellik oluştururID.Tabloya sağ tıklayın
Movieve verileri görüntüle' yi seçin:
Veritabanını çekirdek
SeedData Modeller klasöründe aşağıdaki kodla adlı yeni bir sınıf oluşturun:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
namespace RazorPagesMovie.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new RazorPagesMovieContext(
serviceProvider.GetRequiredService<
DbContextOptions<RazorPagesMovieContext>>()))
{
if (context == null || context.Movie == null)
{
throw new ArgumentNullException("Null RazorPagesMovieContext");
}
// 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();
}
}
}
}
Veritabanında herhangi bir film varsa, tohum başlatıcısı döner ve hiçbir film eklenmez.
if (context.Movie.Any())
{
return;
}
Tohum başlatıcısı ekleme
Program. cs ' i aşağıdaki vurgulanmış kodla güncelleştirin:
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDbContext<RazorPagesMovieContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("RazorPagesMovieContext")));
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
SeedData.Initialize(services);
}
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Önceki kodda, program. cs aşağıdaki şekilde değiştirilmiştir:
- Bağımlılık ekleme (DI) kapsayıcısından bir veritabanı bağlamı örneği alın.
- Yöntemini çağırın
seedData.Initialize, bunu veritabanı bağlamı örneğine geçirerek. - Çekirdek yöntemi tamamlandığında bağlamı atın. Using deyimleri , içeriğin atılmasını sağlar.
Çalıştırılmayan aşağıdaki özel durum oluşur Update-Database :
SqlException: Cannot open database "RazorPagesMovieContext-" requested by the login. The login failed.Login failed for user 'user name'.
Uygulamayı test etme
Çekirdek yöntemin çalışması için veritabanındaki tüm kayıtları silin. Veritabanını temel alarak uygulamayı durdurup başlatın. Veritabanı birlikte yoksa, üzerine bir kesme noktası koyun if (context.Movie.Any()) ve kodun içine geçin.
Uygulama, sağlanan verileri gösterir:

