第 4 部分,将模型添加到 ASP.NET Core MVC 应用
ASP.NET Core MVC 教程系列的第 4 部分。
欢迎各位兄弟 发布技术文章
这里的技术是共享的
作者:Rick Anderson 和 Jon P Smith。
MvcMovieContext
对象处理连接到数据库并将 Movie
对象映射到数据库记录的任务。 在 Startup.cs 文件的 ConfigureServices
方法中向依赖关系注入容器注册数据库上下文:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<MvcMovieContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));}
ASP.NET Core 配置系统会读取 ConnectionString
键。 进行本地开发时,它从 appsettings.json 文件获取连接字符串:
"ConnectionStrings": {
"MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"}
当应用部署到测试服务器或生产服务器时,环境变量可用于将连接字符串设置为生产 SQL Server。 有关详细信息,请参阅配置。
LocalDB:
是 SQL Server Express 数据库引擎的一个轻量级版本,默认与 Visual Studio 一起安装。
使用连接字符串按需启动。
面向程序开发。 它在用户模式下运行,因此没有复杂的配置。
默认情况下,在 C:/Users/{user} 目录中创建 .mdf 文件。
从“视图”菜单中,打开“SQL Server 对象资源管理器”(SSOX) 。
右键单击 Movie
表,然后单击“视图设计器”
请注意 ID
旁边的密钥图标。 默认情况下,EF 将名为 ID
的属性设置为主键。
右键单击 Movie
表,然后单击“查看数据”
在 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();
}
}
}
}
如果数据库中有任何电影,则会返回种子初始值设定项,并且不会添加任何电影。
C#if (context.Movie.Any())
{
return; // DB has been seeded.
}
将 Program.cs 的内容替换为以下代码:
C#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>();
});
}
}
测试应用。
删除数据库中的所有记录。 可以使用浏览器中的删除链接,也可从 SSOX 执行此操作。
通过调用 Startup
类中的方法强制应用初始化,使种子方法能够正常运行。 若要强制进行初始化,必须先停止 IIS Express,然后再重新启动它。 可以使用以下任一方法来执行此操作:
右键单击通知区域中的 IIS Express 系统任务栏图标,然后点击“退出”或“停止站点” :
如果是在非调试模式下运行 VS 的,请按 F5 以在调试模式下运行
如果是在调试模式下运行 VS 的,请停止调试程序并按 F5
应用将显示设定为种子的数据。