ASP.NET CORE RAZOR :初始化数据库
官方说法是:设定数据库种子https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/sql
应用背景:初次部署系统时,设定一些默认的数据,比如后台管理员初始账号等信息。
在 Models 文件夹中创建一个名为 SeedData
的新类。 将生成的代码替换为以下代码:
- using Microsoft.EntityFrameworkCore;
- using Microsoft.Extensions.DependencyInjection;
- using System;
- using System.Linq;
- namespace RazorPagesMovie.Models
- {
- public static class SeedData
- {
- public static void Initialize(IServiceProvider serviceProvider)
- {
- using (var context = new MovieContext(
- serviceProvider.GetRequiredService<DbContextOptions<MovieContext>>()))
- {
- // 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();
- }
- }
- }
- }
如果 DB 中没有任何电影,则会返回种子初始值设定项,并且不会添加任何电影。(不是很理解该翻译,个人理解是:如果数据表中存在记录,则返回,不会将初始化数据写入数据表中。)
- if (context.Movie.Any())
- {
- return; // DB has been seeded.
- }
添加种子初始值设定项
将种子初始值设定项添加 Program.cs 文件中的 Main
方法末端:
- // Unused usings removed.
- using Microsoft.AspNetCore;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Extensions.Logging;
- using RazorPagesMovie.Models;
- using System;
- using Microsoft.EntityFrameworkCore;
- namespace RazorPagesMovie
- {
- public class Program
- {
- public static void Main(string[] args)
- {
- var host = BuildWebHost(args);//初始化数据库开始
- using (var scope = host.Services.CreateScope())
- {
- var services = scope.ServiceProvider;
- try
- {
- var context = services.GetRequiredService<MovieContext>();
- // 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, "An error occurred seeding the DB.初始化数据库时发生错误!");
- }
- }//初始化数据库结束
- host.Run();
- }
- public static IWebHost BuildWebHost(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseStartup<Startup>()
- .Build();
- }
- }
测试应用
- 删除 DB 中的所有记录。 可以使用浏览器中的删除链接,也可以从 SSOX 执行此操作
强制应用初始化(调用
Startup
类中的方法),使种子方法能够正常运行。 若要强制进行初始化,必须先停止 IIS Express,然后再重新启动它。 可以使用以下任一方法来执行此操作:右键单击通知区域中的 IIS Express 系统任务栏图标,然后点击“退出”或“停止站点”:
- 如果是在非调试模式下运行 VS 的,请按 F5 以在调试模式下运行。
- 如果是在调试模式下运行 VS 的,请停止调试程序并按 F5。
- 应用将显示设定为种子的数据:
- 但是这里存在另外一个问题:如果一部分数据库数据表中已经存在数据了,现在又想初始化另外的数据表怎么办?
- 改造一下
- 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
- }
- );
- }
- if (!context.Class.Any())
- {
- //return;
- context.Class.AddRange(
- new Class
- {
- Name = "国产电影",
- bz = "国产电影备注"
- },
- new Class
- {
- Name = "日韩电影",
- bz = "日韩电影备注"
- });
- }
- context.SaveChanges();
测试:删掉任意一个数据库中的数据,然后重启,原本存在数据的数据表不会有改动,没有数据的数据表将写入默认数据。
ASP.NET CORE RAZOR :初始化数据库的更多相关文章
- 学习ASP.NET Core Razor 编程系列六——数据库初始化
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十一——把新字段更新到数据库
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列七——修改列表页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列八——并发处理
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列九——增加查询功能
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十——添加新字段
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- 如何在natTable表格上添加双击事件
在项目当中,有时候需要双击表格中的某一行触发一个事件或者一次数据请求,这时候,我们就需要在表格中绑定相关事件,思路实际上很简单,添加一个绑定事件就ok了,那么怎么添加呢?简单实现如下: 1.创建绑定双 ...
- Mongodb的使用(上)
简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自 ...
- HTML5面向对象的游戏开发简单实例总结
在阅读一本HTML5游戏开发相关书籍时发现一个很好的例子,通过这个例子可以对面向对象的开发进行更深入的理解.这个对象要实现的是:将一个CSS sprite中的图像绘制到canvas中.首先创建一个Sp ...
- (3)oracle建用户、建表、权限、命名空间
一.表空间 创建表空间 create tablespace ts001 datafile ‘d:\test\a.dbf’ size 20m uniform size 128k; 使用表空间 cre ...
- ThinkPHP中实例化对象M()和D()的区别
ThinkPHP中实例化对象M()和D()的区别 ThinkPHP中实例化对象M()和D()的区别?ThinkPHP如何实例化对象?在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法 ...
- ASIHTTPRequest学习(四)
如果是IOS5的版本,可能集成过程中会遇到一些问题,我也找到了一些解决方案,比如,集成完后可能会遇到编译提示找不到"libxml/HTMLparser.h",解决这个问题可以参考这 ...
- Incorrect key file for table '/tmp/#sql_46fd_0.MYI'; try to repair it
当查询数量很大时,(我的数据库70万数据),会导致这个错误,这是MYSQL中的一个bug. 解决方法 : 1. 修复表 check table tablename. 查看表的状态.如果有错误,则需 ...
- JAVA之ArrayList集合
/** * ArrayList集合讲解 * 集合的添加.遍历.删除 */package com.test; import java.util.*; public class test7 { /** ...
- C#拦截系统消息的方法-Application.AddMessageFilter
C#拦截系统消息的方法Application.AddMessageFilter Application.AddMessageFilter这个方法可以接收系统发出的消息: 首先定义一个类,继承IMess ...
- object references an unsaved transient instance - save the transient instance before flushing异常问题处理
一.异常:org.hibernate.TransientObjectException: object references an unsaved transient instance - save ...