学习 ASP.NET Core Razor 编程系列目录
学习 ASP.NET Core Razor 编程系列一
学习 ASP.NET Core Razor 编程系列二 -- 添加一个实体
学习 ASP.NET Core Razor 编程系列三 -- 创建数据表及创建项目基本页面
学习 ASP.NET Core Razor 编程系列四 --Asp.Net Core Razor 列表模板页面
学习 ASP.NET Core Razor 编程系列五 --Asp.Net Core Razor 新建模板页面
Asp.net Core EF 创建的 BookContext 对象, 就是用于处理数据库连接和将 Book 实体对象映射到数据库表 (Book) 记录的功能. 数据库上下文 (BookContext) 是在 startup.cs 文件的 configureservices 方法中向依赖关系注入容器注册, 代码如下:
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddDbContext<BookContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("BookContext")));
- services.AddMvc();
- }
ASP.NET Core 配置系统会读取数据库连接字符串. 为了进行本地开发, 它会从 appsettings.json 文件获取数据库连接字符串, 数据库连接配置如下:
- "ConnectionStrings": {
- "BookContext": "Server=.\\sqlexpress;Database=CustomDB;Trusted_Connection=True;MultipleActiveResultSets=true"
- }
将应用程序部署到测试或生产服务器时, 可以修改 Appsettings.json 文件中上将配置, 将数据库连接字符串设置为真正的 SQL 服务器.
给数据库添加初始数据
在 Visual Studio 2017 的解决方案资源管理器中, 使用鼠标左键选中 Models 文件, 然后点击鼠标右键, 在弹出菜单中选择创建一个新的类文件, 命名为 SeedData. 用下面的代码替换生成的代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using Microsoft.EntityFrameworkCore;
- using Microsoft.Extensions.DependencyInjection;
- namespace RazorMvcBooks.Models
- {
- public class SeedData
- {
- public static void Initialize(IServiceProvider serviceProvider)
- {
- using (var context = new BookContext( serviceProvider.GetRequiredService<DbContextOptions<BookContext>>()))
- {
- // Look for any Books.
- if (context.Book.Any())
- {
- return; // DB has been seeded
- }
- context.Book.AddRange(
- new Book
- {
- Name = "Python 编程 从入门到实践",
- ReleaseDate = DateTime.Parse("2018-1-12"),
- Author = "埃里克. 马瑟斯",
- Price = 75.99M
- },
- new Book
- {
- Name = "Java 编程的逻辑",
- ReleaseDate = DateTime.Parse("2018-1-13"),
- Author = "马俊昌",
- Price = 48.99M
- },
- new Book
- {
- Name = "统计思维: 大数据时代瞬间洞察因果的关键技能",
- ReleaseDate = DateTime.Parse("2017-12-23"),
- Author = "西内启",
- Price = 39.99M
- },
- new Book
- {
- Name = "微信营销",
- ReleaseDate = DateTime.Parse("2018-01-05"),
- Author = "徐林海",
- Price = 33.99M
- }
- );
- context.SaveChanges();
- }
- }
- }
- }
以下语句的作用是 如果数据库中有 Book 表, 数据初始化类将返回, 不添加任何数据.
- // Look for any Books.
- if (context.Book.Any())
- {
- return; // DB has been seeded
- }
添加 SeedData.initializer 方法
在 Visual Studio 2017 的解决方案资源管理器中打开 Program.cs 文件, 然后找到 Main 方法, 在这个方法体的最后面添加 SeedData.Initialize()方法, 代码如下:
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.Logging;
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.EntityFrameworkCore;
- using RazorMvcBooks.Models;
- namespace RazorMvcBooks
- {
- public class Program
- {
- public static void Main(string[] args)
- {
- // BuildwebHost(args).Run();
- var host = BuildWebHost(args);
- using (var scope = host.Services.CreateScope())
- {
- var services = scope.ServiceProvider;
- try
- {
- var context = services.GetRequiredService<BookContext>();
- // requires using Microsoft.EntityFrameworkCore;
- context.Database.Migrate();
- // Requires using RazorPagesMovie.Models;
- SeedData.Initialize(services);
- }
- catch (Exception ex)
- {
- var logger = services.GetRequiredService<ILogger<Program>>();
- logger.LogError(ex, "数据库数据初始化错误.");
- }
- }
- host.Run();
- }
- public static IWebHost BuildWebHost(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseStartup<Startup>()
- .Build();
- }
- }
测试应用程序
第一步, 删除数据库中的所有记录. 可以在浏览器的书籍列表页面中使用删除链接, 或可以在数据库的 SQL Server Management Studio 中使用删除指令删除. 在浏览器我们进行浏览, 删除之前与之后的界面如下图.
第二步, 强制应用程序初始化(调用 Startup 类中的方法), 这样 SeedData 方法能够正常运行. 如果要强制初始化, 必须先停止 IIS, 然后再重新启动. 您可以使用以下方法:
1. 在通知区域中右键单击 IIS Express 系统托盘图标, 在弹出菜单中使用鼠标左键点击 "退出" 或 " 停止站点. 如下图.
2. 如果是在非调试模式下运行 Visual Studio 2017 , 请按 F5 以在调试模式下运行.
3. 如果是在调试模式下运行 Visual Studio 2017 , 请先停止调试程序, 并再按 F5.
第三步, 在浏览器中浏览我们添加到数据库的初始化数据, 如下图. 下图 1 处, 是原来的数据, 图 2 是我们应用程序初始化添加进行的数据. 仔细观察一下 ReleaseDate 与 Price, 可以发现有区别.
来源: https://www.cnblogs.com/chillsrc/p/8872303.html