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

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

介绍

本教程系列的这一部分重点介绍如何在 ASP.NET Core MVC 应用程序中使用 SQL 数据库。

你将了解如何:

为 ASP.NET Core MVC 应用注册和配置Entity Framework Core数据库上下文。

在本地开发中使用数据库连接字符串。

使用 SQL Server Express LocalDB 进行开发,并使用 SQL Server 对象资源管理器 检查数据库和数据。

使用初始示例数据来初始化数据库。

先决条件

本教程使用在上一步中设置的数据库:Part 4,将模型添加到 ASP.NET Core MVC 应用。

使用数据库上下文

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

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 Configuration 系统读取 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 Configuration 系统读取 ConnectionString。 对于本地开发,它从 appsettings.json 文件中获取连接字符串:

"ConnectionStrings": {

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

}

警告

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

Visual Studio

Visual Studio Code/Visual Studio for Mac

SQL Server Express LocalDB(本地数据库)

LocalDB:

是默认情况下随Visual Studio一起安装的 SQL Server Express 数据库引擎的轻型版本。

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

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

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

检查数据库

在 View 菜单中,打开 SQL Server 对象资源管理器 (SSOX)。

右键单击 Movie 表 > 视图设计器

在“电影表”上点击右键 > 查看设计器

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

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

在“Movie”表上右键单击 查看数据

SQLite

SQLite 网站上表示:

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

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

注意

在本教程中,尽可能使用 Entity Framework Core migrations 功能。 迁移会更新数据库架构,使其与数据模型中的更改相匹配。 但是,迁移只能执行 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方法运行并填充数据库。

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

注意

可能无法在小数字段中输入十进制逗号。 若要使 jQuery 验证支持使用逗号(“,”)表示小数点的的非英语区域设置,以及支持非美国英语日期格式,必须执行使应用全球化的步骤。

有关添加十进制逗号的说明,请参阅此GitHub注释 4076。

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

相关文章

乐都附近哪里有钓鱼的地方
365bet网球比赛比分

乐都附近哪里有钓鱼的地方

⌚ 09-28 👁️‍🗨️ 2600