在 ASP.NET Core 中使用 SQLWork with SQL in ASP.NET Core

本文内容

作者:Rick Anderson

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddControllersWithViews();
  4. services.AddDbContext<MvcMovieContext>(options =>
  5. options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
  6. }

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

  1. "ConnectionStrings": {
  2. "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  3. }
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddControllersWithViews();
  4. services.AddDbContext<MvcMovieContext>(options =>
  5. options.UseSqlite(Configuration.GetConnectionString("MvcMovieContext")));
  6. }

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

  1. "ConnectionStrings": {
  2. "MovieContext": "Data Source=MvcMovie.db"
  3. }

当应用部署到测试服务器或生产服务器时,环境变量可用于将连接字符串设置为生产 SQL Server。有关详细信息,请参阅配置

SQL Server Express LocalDBSQL Server Express LocalDB

LocalDB 是轻型版的 SQL Server Express 数据库引擎,以程序开发为目标。LocalDB 作为按需启动并在用户模式下运行的轻量级数据库没有复杂的配置。默认情况下,LocalDB 数据库在 C:/Users/{user} 目录中创建 .mdf 文件 。

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

“视图”菜单

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

Movie 表上打开的上下文菜单

设计器中打开的 Movie 表

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

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

Movie 表上打开的上下文菜单

显示表数据的打开的 Movie 表

SQLiteSQLite

SQLite 网站上表示:


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


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

显示电影数据库的 DB Browser for SQLite

备注

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

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

  • 创建新表。
  • 将旧表中的数据复制到新表中。
  • 放弃旧表。
  • 为新表重命名。

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

设定数据库种子Seed the database

在 Models 文件夹中创建一个名为 SeedData 的新类 。将生成的代码替换为以下代码:

  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using MvcMovie.Data;
  4. using System;
  5. using System.Linq;
  6. namespace MvcMovie.Models
  7. {
  8. public static class SeedData
  9. {
  10. public static void Initialize(IServiceProvider serviceProvider)
  11. {
  12. using (var context = new MvcMovieContext(
  13. serviceProvider.GetRequiredService<
  14. DbContextOptions<MvcMovieContext>>()))
  15. {
  16. // Look for any movies.
  17. if (context.Movie.Any())
  18. {
  19. return; // DB has been seeded
  20. }
  21. context.Movie.AddRange(
  22. new Movie
  23. {
  24. Title = "When Harry Met Sally",
  25. ReleaseDate = DateTime.Parse("1989-2-12"),
  26. Genre = "Romantic Comedy",
  27. Price = 7.99M
  28. },
  29. new Movie
  30. {
  31. Title = "Ghostbusters ",
  32. ReleaseDate = DateTime.Parse("1984-3-13"),
  33. Genre = "Comedy",
  34. Price = 8.99M
  35. },
  36. new Movie
  37. {
  38. Title = "Ghostbusters 2",
  39. ReleaseDate = DateTime.Parse("1986-2-23"),
  40. Genre = "Comedy",
  41. Price = 9.99M
  42. },
  43. new Movie
  44. {
  45. Title = "Rio Bravo",
  46. ReleaseDate = DateTime.Parse("1959-4-15"),
  47. Genre = "Western",
  48. Price = 3.99M
  49. }
  50. );
  51. context.SaveChanges();
  52. }
  53. }
  54. }
  55. }

如果 DB 中有任何电影,则会返回种子初始值设定项,并且不会添加任何电影。

  1. if (context.Movie.Any())
  2. {
  3. return; // DB has been seeded.
  4. }

添加种子初始值设定项Add the seed initializer

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

  1. using Microsoft.AspNetCore.Hosting;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using Microsoft.Extensions.Hosting;
  4. using Microsoft.Extensions.Logging;
  5. using MvcMovie.Data;
  6. using MvcMovie.Models;
  7. using System;
  8. namespace MvcMovie
  9. {
  10. public class Program
  11. {
  12. public static void Main(string[] args)
  13. {
  14. var host = CreateHostBuilder(args).Build();
  15. using (var scope = host.Services.CreateScope())
  16. {
  17. var services = scope.ServiceProvider;
  18. try
  19. {
  20. SeedData.Initialize(services);
  21. }
  22. catch (Exception ex)
  23. {
  24. var logger = services.GetRequiredService<ILogger<Program>>();
  25. logger.LogError(ex, "An error occurred seeding the DB.");
  26. }
  27. }
  28. host.Run();
  29. }
  30. public static IHostBuilder CreateHostBuilder(string[] args) =>
  31. Host.CreateDefaultBuilder(args)
  32. .ConfigureWebHostDefaults(webBuilder =>
  33. {
  34. webBuilder.UseStartup<Startup>();
  35. });
  36. }
  37. }

测试应用

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

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

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

IIS Express 系统任务栏图标

上下文菜单

  1. - 如果是在非调试模式下运行 VS 的,请按 F5 以在调试模式下运行
  2. - 如果是在调试模式下运行 VS 的,请停止调试程序并按 F5

删除 DB 中的所有记录(使种子方法运行)。停止并启动应用以设定数据库种子。

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

在 Microsoft Edge 中打开的显示电影数据的 MVC 电影应用程序

上一页下一页

作者:Rick Anderson

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.Configure<CookiePolicyOptions>(options =>
  4. {
  5. // This lambda determines whether user consent for non-essential cookies
  6. // is needed for a given request.
  7. options.CheckConsentNeeded = context => true;
  8. options.MinimumSameSitePolicy = SameSiteMode.None;
  9. });
  10. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  11. services.AddDbContext<MvcMovieContext>(options =>
  12. options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
  13. }

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

  1. "ConnectionStrings": {
  2. "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  3. }
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.Configure<CookiePolicyOptions>(options =>
  4. {
  5. // This lambda determines whether user consent for
  6. // non-essential cookies is needed for a given request.
  7. options.CheckConsentNeeded = context => true;
  8. options.MinimumSameSitePolicy = SameSiteMode.None;
  9. });
  10. services.AddDbContext<MvcMovieContext>(options =>
  11. options.UseSqlite(Configuration.GetConnectionString("MovieContext")));
  12. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  13. }

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

  1. "ConnectionStrings": {
  2. "MovieContext": "Data Source=MvcMovie.db"
  3. }

将应用部署到测试或生产服务器时,可使用环境变量或另一种方法将连接字符串设置为实际的 SQL Server。有关详细信息,请参阅配置

SQL Server Express LocalDBSQL Server Express LocalDB

LocalDB 是轻型版的 SQL Server Express 数据库引擎,以程序开发为目标。LocalDB 作为按需启动并在用户模式下运行的轻量级数据库没有复杂的配置。默认情况下,LocalDB 数据库在 C:/Users/{user} 目录中创建 .mdf 文件 。

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

“视图”菜单

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

Movie 表上打开的上下文菜单

设计器中打开的 Movie 表

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

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

Movie 表上打开的上下文菜单

显示表数据的打开的 Movie 表

SQLiteSQLite

SQLite 网站上表示:


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


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

显示电影数据库的 DB Browser for SQLite

备注

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

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

  • 创建新表。
  • 将旧表中的数据复制到新表中。
  • 放弃旧表。
  • 为新表重命名。

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

设定数据库种子Seed the database

在 Models 文件夹中创建一个名为 SeedData 的新类 。将生成的代码替换为以下代码:

  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using System;
  4. using System.Linq;
  5. namespace MvcMovie.Models
  6. {
  7. public static class SeedData
  8. {
  9. public static void Initialize(IServiceProvider serviceProvider)
  10. {
  11. using (var context = new MvcMovieContext(
  12. serviceProvider.GetRequiredService<
  13. DbContextOptions<MvcMovieContext>>()))
  14. {
  15. // Look for any movies.
  16. if (context.Movie.Any())
  17. {
  18. return; // DB has been seeded
  19. }
  20. context.Movie.AddRange(
  21. new Movie
  22. {
  23. Title = "When Harry Met Sally",
  24. ReleaseDate = DateTime.Parse("1989-2-12"),
  25. Genre = "Romantic Comedy",
  26. Price = 7.99M
  27. },
  28. new Movie
  29. {
  30. Title = "Ghostbusters ",
  31. ReleaseDate = DateTime.Parse("1984-3-13"),
  32. Genre = "Comedy",
  33. Price = 8.99M
  34. },
  35. new Movie
  36. {
  37. Title = "Ghostbusters 2",
  38. ReleaseDate = DateTime.Parse("1986-2-23"),
  39. Genre = "Comedy",
  40. Price = 9.99M
  41. },
  42. new Movie
  43. {
  44. Title = "Rio Bravo",
  45. ReleaseDate = DateTime.Parse("1959-4-15"),
  46. Genre = "Western",
  47. Price = 3.99M
  48. }
  49. );
  50. context.SaveChanges();
  51. }
  52. }
  53. }
  54. }

如果 DB 中有任何电影,则会返回种子初始值设定项,并且不会添加任何电影。

  1. if (context.Movie.Any())
  2. {
  3. return; // DB has been seeded.
  4. }

添加种子初始值设定项Add the seed initializer

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

  1. using Microsoft.AspNetCore;
  2. using Microsoft.AspNetCore.Hosting;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Logging;
  5. using System;
  6. using Microsoft.EntityFrameworkCore;
  7. using MvcMovie.Models;
  8. using MvcMovie;
  9. namespace MvcMovie
  10. {
  11. public class Program
  12. {
  13. public static void Main(string[] args)
  14. {
  15. var host = CreateWebHostBuilder(args).Build();
  16. using (var scope = host.Services.CreateScope())
  17. {
  18. var services = scope.ServiceProvider;
  19. try
  20. {
  21. var context = services.GetRequiredService<MvcMovieContext>();
  22. context.Database.Migrate();
  23. SeedData.Initialize(services);
  24. }
  25. catch (Exception ex)
  26. {
  27. var logger = services.GetRequiredService<ILogger<Program>>();
  28. logger.LogError(ex, "An error occurred seeding the DB.");
  29. }
  30. }
  31. host.Run();
  32. }
  33. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  34. WebHost.CreateDefaultBuilder(args)
  35. .UseStartup<Startup>();
  36. }
  37. }

测试应用

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

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

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

IIS Express 系统任务栏图标

上下文菜单

  1. - 如果是在非调试模式下运行 VS 的,请按 F5 以在调试模式下运行
  2. - 如果是在调试模式下运行 VS 的,请停止调试程序并按 F5

删除 DB 中的所有记录(使种子方法运行)。停止并启动应用以设定数据库种子。

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

在 Microsoft Edge 中打开的显示电影数据的 MVC 电影应用程序

上一页下一页