第 5 部分,在 ASP.NET Core MVC 应用中使用数据库

MvcMovieContext 对象处理连接到数据库并将 Movie 对象映射到数据库记录的任务。 在 文件的 ConfigureServices 方法中,向Startup.cs容器注册数据库上下文:

Visual Studio

Visual Studio Code /Visual Studio for Mac

public void ConfigureServices(IServiceCollection services)

{

services.AddControllersWithViews();

services.AddDbContext(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"

}

public void ConfigureServices(IServiceCollection services)

{

services.AddControllersWithViews();

services.AddDbContext(options =>

options.UseSqlite(Configuration.GetConnectionString("MvcMovieContext")));

}

ASP.NET Core 配置系统会读取 ConnectionString。 进行本地开发时,它从 appsettings.json 文件获取连接字符串:

"ConnectionStrings": {

"MvcMovieContext": "Data Source=MvcMovie.db"

}

警告

本文使用不需要对用户进行身份验证的本地数据库。 生产应用应使用可用的最安全的身份验证流。 有关已部署测试和生产应用的身份验证的详细信息,请参阅安全身份验证流。

Visual Studio

Visual Studio Code /Visual Studio for Mac

SQL Server Express LocalDB(本地数据库)

LocalDB:

是 SQL Server Express 数据库引擎的一个轻量级版本,默认与 Visual Studio 一起安装。

使用连接字符串按需启动。

面向程序开发。 它在用户模式下运行,因此没有复杂的配置。

默认情况下,在 C:/Users/{user} 目录中创建 .mdf 文件。

检查数据库

从“视图”菜单中,打开“SQL Server 对象资源管理器”(SSOX) 。

右键单击 Movie 表,然后单击“视图设计器”

>

请注意 ID 旁边的密钥图标。 默认情况下,EF 将名为 ID 的属性设置为主键。

右键单击 Movie 表,然后单击“查看数据”

>

SQLite

SQLite 网站上表示:

SQLite 是一个自包含、高可靠性、嵌入式、功能完整、公共域的 SQL 数据库引擎。 SQLite 是世界上使用最多的数据库引擎。

可以下载许多第三方工具来管理并查看 SQLite 数据库。 下面的图片来自 DB Browser for SQLite。 如果你有最喜欢的 SQLite 工具,请发表评论以分享你喜欢的方面。

注意

在本教程中,使用 Entity Framework Core 迁移功能(若可行)。 迁移会更新数据库架构,使其与数据模型中的更改相匹配。 但是,迁移只能执行 EF Core 提供程序所支持的更改类型,且 SQLite 提供程序的功能有限。 例如,支持添加列,但不支持删除或更改列。 如果已创建迁移以删除或更改列,则 ef migrations add 命令将成功,但 ef database update 命令会失败。 由于上述限制,本教程不对 SQLite 架构更改使用迁移。 转而在架构更改时,放弃并重新创建数据库。

要绕开 SQLite 限制,可手动写入迁移代码,在表内容更改时重新生成表。 表重新生成涉及:

创建新表。

将旧表中的数据复制到新表中。

放弃旧表。

为新表重命名。

有关更多信息,请参见以下资源:

SQLite EF Core 数据库提供程序限制

自定义迁移代码

数据种子设定

SQLite ALTER TABLE 语句

设定数据库种子

在 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>()))

{

// 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 has been seeded.

}

添加种子初始值设定项

将 Program.cs 的内容替换为以下代码:

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>();

logger.LogError(ex, "An error occurred seeding the DB.");

}

}

host.Run();

}

public static IHostBuilder CreateHostBuilder(string[] args) =>

Host.CreateDefaultBuilder(args)

.ConfigureWebHostDefaults(webBuilder =>

{

webBuilder.UseStartup();

});

}

}

测试应用。

Visual Studio

Visual Studio Code /Visual Studio for Mac

删除数据库中的所有记录。 可以使用浏览器中的删除链接,也可从 SSOX 执行此操作。

通过调用 Startup 类中的方法强制应用初始化,使种子方法能够正常运行。 若要强制进行初始化,必须先停止 IIS Express,然后再重新启动它。 可以使用以下任一方法来执行此操作:

右键单击通知区域中的 IIS Express 系统任务栏图标,然后点击“退出”或“停止站点” :

如果是在非调试模式下运行 VS 的,请按 F5 以在调试模式下运行

如果是在调试模式下运行 VS 的,请停止调试程序并按 F5

删除数据库中的所有记录。 停止并启动应用,使 SeedData.Initialize 方法运行并设定数据库种子。

应用将显示设定为种子的数据。

上一篇:添加模型下一篇:添加控制器方法和视图

Copyright © 2022 星辰幻想游戏活动专区 All Rights Reserved.