MvcMovieContext 對(duì)象處理連接到數(shù)據(jù)庫(kù)并將 Movie 對(duì)象映射到數(shù)據(jù)庫(kù)記錄的任務(wù)。 在 Startup.cs 文件的 ConfigureServices 方法中向依賴關(guān)系注入容器注冊(cè)數(shù)據(jù)庫(kù)上下文:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies
// is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
}
ASP.NET Core 配置系統(tǒng)會(huì)讀取 ConnectionString
。 為了進(jìn)行本地開(kāi)發(fā),它會(huì)從 appsettings.json 文件獲取連接字符串:
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
}
將應(yīng)用部署到測(cè)試或生產(chǎn)服務(wù)器時(shí),可使用環(huán)境變量或另一種方法將連接字符串設(shè)置為實(shí)際的 SQL Server。 有關(guān)詳細(xì)信息,請(qǐng)參閱配置。
LocalDB 是輕型版的 SQL Server Express 數(shù)據(jù)庫(kù)引擎,以程序開(kāi)發(fā)為目標(biāo)。 LocalDB 作為按需啟動(dòng)并在用戶模式下運(yùn)行的輕量級(jí)數(shù)據(jù)庫(kù)沒(méi)有復(fù)雜的配置。 默認(rèn)情況下,LocalDB 數(shù)據(jù)庫(kù)在 C:/Users/{user} 目錄中創(chuàng)建 .mdf 文件。
從“視圖”菜單中,打開(kāi)“SQL Server 對(duì)象資源管理器”(SSOX)。
右鍵單擊 Movie
表,然后單擊“視圖設(shè)計(jì)器”
請(qǐng)注意 ID
旁邊的密鑰圖標(biāo)。 默認(rèn)情況下,EF 將名為 ID
的屬性設(shè)置為主鍵。
右鍵單擊 Movie
表,然后單擊“查看數(shù)據(jù)”
在 Models 文件夾中創(chuàng)建一個(gè)名為 SeedData 的新類。 將生成的代碼替換為以下代碼:
C#
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
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();
}
}
}
}
如果 DB 中沒(méi)有任何電影,則會(huì)返回種子初始值設(shè)定項(xiàng),并且不會(huì)添加任何電影。
C#
if (context.Movie.Any())
{
return; // DB has been seeded.
}
將 Program.cs 的內(nèi)容替換為以下代碼:
C#
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
using MvcMovie;
namespace MvcMovie
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<MvcMovieContext>();
context.Database.Migrate();
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 IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
測(cè)試應(yīng)用
刪除 DB 中的所有記錄。 可以使用瀏覽器中的刪除鏈接,也可從 SSOX 執(zhí)行此操作。
強(qiáng)制應(yīng)用初始化(調(diào)用 Startup
類中的方法),使種子方法能夠正常運(yùn)行。 若要強(qiáng)制進(jìn)行初始化,必須先停止 IIS Express,然后再重新啟動(dòng)它。 可以使用以下任一方法來(lái)執(zhí)行此操作:
右鍵單擊通知區(qū)域中的 IIS Express 系統(tǒng)任務(wù)欄圖標(biāo),然后點(diǎn)擊“退出”或“停止站點(diǎn)”
應(yīng)用將顯示設(shè)定為種子的數(shù)據(jù)。
更多建議: