官方说法是:设定数据库种子https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/sql

应用背景:初次部署系统时,设定一些默认的数据,比如后台管理员初始账号等信息。

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

  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using System;
  4. using System.Linq;
  5.  
  6. namespace RazorPagesMovie.Models
  7. {
  8. public static class SeedData
  9. {
  10. public static void Initialize(IServiceProvider serviceProvider)
  11. {
  12. using (var context = new MovieContext(
  13. serviceProvider.GetRequiredService<DbContextOptions<MovieContext>>()))
  14. {
  15. // Look for any movies.
  16. if (context.Movie.Any())
  17. {
  18. return; // DB has been seeded
  19. }
  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.  
  30. new Movie
  31. {
  32. Title = "Ghostbusters",
  33. ReleaseDate = DateTime.Parse("1984-3-13"),
  34. Genre = "Comedy",
  35. Price = 8.99M
  36. },
  37.  
  38. new Movie
  39. {
  40. Title = "Ghostbusters 2",
  41. ReleaseDate = DateTime.Parse("1986-2-23"),
  42. Genre = "Comedy",
  43. Price = 9.99M
  44. },
  45.  
  46. new Movie
  47. {
  48. Title = "Rio Bravo",
  49. ReleaseDate = DateTime.Parse("1959-4-15"),
  50. Genre = "Western",
  51. Price = 3.99M
  52. }
  53. );
  54. context.SaveChanges();
  55. }
  56. }
  57. }
  58. }

如果 DB 中没有任何电影,则会返回种子初始值设定项,并且不会添加任何电影。(不是很理解该翻译,个人理解是:如果数据表中存在记录,则返回,不会将初始化数据写入数据表中。)

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

添加种子初始值设定项

将种子初始值设定项添加 Program.cs 文件中的 Main 方法末端:

  1. // Unused usings removed.
  2. using Microsoft.AspNetCore;
  3. using Microsoft.AspNetCore.Hosting;
  4. using Microsoft.Extensions.DependencyInjection;
  5. using Microsoft.Extensions.Logging;
  6. using RazorPagesMovie.Models;
  7. using System;
  8. using Microsoft.EntityFrameworkCore;
  9.  
  10. namespace RazorPagesMovie
  11. {
  12. public class Program
  13. {
  14. public static void Main(string[] args)
  15. {
  16. var host = BuildWebHost(args);//初始化数据库开始
  17.  
  18. using (var scope = host.Services.CreateScope())
  19. {
  20. var services = scope.ServiceProvider;
  21.  
  22. try
  23. {
  24. var context = services.GetRequiredService<MovieContext>();
  25. // requires using Microsoft.EntityFrameworkCore;
  26. context.Database.Migrate();
  27. // Requires using RazorPagesMovie.Models;
  28. SeedData.Initialize(services);
  29. }
  30. catch (Exception ex)
  31. {
  32. var logger = services.GetRequiredService<ILogger<Program>>();
  33. logger.LogError(ex, "An error occurred seeding the DB.初始化数据库时发生错误!");
  34. }
  35. }//初始化数据库结束
  36.  
  37. host.Run();
  38. }
  39.  
  40. public static IWebHost BuildWebHost(string[] args) =>
  41. WebHost.CreateDefaultBuilder(args)
  42. .UseStartup<Startup>()
  43. .Build();
  44. }
  45. }

测试应用

  1.  
  • 删除 DB 中的所有记录。 可以使用浏览器中的删除链接,也可以从 SSOX 执行此操作
  • 强制应用初始化(调用 Startup 类中的方法),使种子方法能够正常运行。 若要强制进行初始化,必须先停止 IIS Express,然后再重新启动它。 可以使用以下任一方法来执行此操作:

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

  • 如果是在非调试模式下运行 VS 的,请按 F5 以在调试模式下运行。
  • 如果是在调试模式下运行 VS 的,请停止调试程序并按 F5。
  1. 应用将显示设定为种子的数据:
  1. 但是这里存在另外一个问题:如果一部分数据库数据表中已经存在数据了,现在又想初始化另外的数据表怎么办?
  2.  
  3. 改造一下
  1. if (!context.Movie.Any())
  2. {
  3. //return; // DB has been seeded
  4.  
  5. context.Movie.AddRange(
  6. new Movie
  7. {
  8. Title = "When Harry Met Sally",
  9. ReleaseDate = DateTime.Parse("1989-2-12"),
  10. Genre = "Romantic Comedy",
  11. Price = 7.99M
  12. },
  13.  
  14. new Movie
  15. {
  16. Title = "Ghostbusters",
  17. ReleaseDate = DateTime.Parse("1984-3-13"),
  18. Genre = "Comedy",
  19. Price = 8.99M
  20. },
  21.  
  22. new Movie
  23. {
  24. Title = "Ghostbusters 2",
  25. ReleaseDate = DateTime.Parse("1986-2-23"),
  26. Genre = "Comedy",
  27. Price = 9.99M
  28. },
  29.  
  30. new Movie
  31. {
  32. Title = "Rio Bravo",
  33. ReleaseDate = DateTime.Parse("1959-4-15"),
  34. Genre = "Western",
  35. Price = 3.99M
  36. }
  37. );
  38. }
  39. if (!context.Class.Any())
  40. {
  41. //return;
  42.  
  43. context.Class.AddRange(
  44. new Class
  45. {
  46. Name = "国产电影",
  47. bz = "国产电影备注"
  48. },
  49. new Class
  50. {
  51. Name = "日韩电影",
  52. bz = "日韩电影备注"
  53. });
  54. }
  55. context.SaveChanges();
  1.  

测试:删掉任意一个数据库中的数据,然后重启,原本存在数据的数据表不会有改动,没有数据的数据表将写入默认数据。

  1.  

ASP.NET CORE RAZOR :初始化数据库的更多相关文章

  1. 学习ASP.NET Core Razor 编程系列六——数据库初始化

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  2. 学习ASP.NET Core Razor 编程系列十一——把新字段更新到数据库

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. 学习ASP.NET Core Razor 编程系列七——修改列表页面

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. 学习ASP.NET Core Razor 编程系列八——并发处理

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. 学习ASP.NET Core Razor 编程系列九——增加查询功能

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. 学习ASP.NET Core Razor 编程系列十——添加新字段

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  10. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. 如何在natTable表格上添加双击事件

    在项目当中,有时候需要双击表格中的某一行触发一个事件或者一次数据请求,这时候,我们就需要在表格中绑定相关事件,思路实际上很简单,添加一个绑定事件就ok了,那么怎么添加呢?简单实现如下: 1.创建绑定双 ...

  2. Mongodb的使用(上)

    简介 MongoDB 是一个基于分布式 文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自 ...

  3. HTML5面向对象的游戏开发简单实例总结

    在阅读一本HTML5游戏开发相关书籍时发现一个很好的例子,通过这个例子可以对面向对象的开发进行更深入的理解.这个对象要实现的是:将一个CSS sprite中的图像绘制到canvas中.首先创建一个Sp ...

  4. (3)oracle建用户、建表、权限、命名空间

    一.表空间 创建表空间 create tablespace  ts001  datafile ‘d:\test\a.dbf’ size 20m uniform size 128k; 使用表空间 cre ...

  5. ThinkPHP中实例化对象M()和D()的区别

    ThinkPHP中实例化对象M()和D()的区别 ThinkPHP中实例化对象M()和D()的区别?ThinkPHP如何实例化对象?在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法 ...

  6. ASIHTTPRequest学习(四)

    如果是IOS5的版本,可能集成过程中会遇到一些问题,我也找到了一些解决方案,比如,集成完后可能会遇到编译提示找不到"libxml/HTMLparser.h",解决这个问题可以参考这 ...

  7. Incorrect key file for table '/tmp/#sql_46fd_0.MYI'; try to repair it

    当查询数量很大时,(我的数据库70万数据),会导致这个错误,这是MYSQL中的一个bug. 解决方法 :   1. 修复表 check table tablename. 查看表的状态.如果有错误,则需 ...

  8. JAVA之ArrayList集合

    /** * ArrayList集合讲解 * 集合的添加.遍历.删除 */package com.test; import java.util.*; public class test7 { /**   ...

  9. C#拦截系统消息的方法-Application.AddMessageFilter

    C#拦截系统消息的方法Application.AddMessageFilter Application.AddMessageFilter这个方法可以接收系统发出的消息: 首先定义一个类,继承IMess ...

  10. object references an unsaved transient instance - save the transient instance before flushing异常问题处理

    一.异常:org.hibernate.TransientObjectException: object references an unsaved transient instance - save ...