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

打印 上一主题 下一主题

主题 893|帖子 893|积分 2679

学习ASP.NET Core Blazor编程系列一——综述学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(下) 

学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)学习ASP.NET Core Blazor编程系列三——实体学习ASP.NET Core Blazor编程系列四——迁移学习ASP.NET Core Blazor编程系列五——列表页面  
       在学习ASP.NET Core Blazor编程系列三——实体这篇文章中我们创建了数据库上下文BookContex类,这个类就是用于处理数据库连接和将Book实体对象映射到数据库表(Book)记录。数据库上下文(BookContext)是在Program.cs文件的builder.Services.AddDbContextFactory方法中向依赖关系注入容器进行注册,具体代码如下:
  1. builder.Services.AddDbContextFactory<BookContext>(opt =>
  2. opt.UseSqlServer(ConfigHelper.Configuration["ConnectionStrings:BookContext"]));
复制代码
        为了进行本地开发,我们在appsettings.json 文件中配置数据库连接字符串,数据库连接配置如下:
  1.   "ConnectionStrings": {
  2.     "BookContext": "Server=.;Database=LeaseBook;Trusted_Connection=True;<br>MultipleActiveResultSets=true"
  3.   }
复制代码
       将应用程序部署到测试或生产服务器时,可以修改Appsettings.json文件中上将配置,将数据库连接字符串设置为真正的SQL服务器。

       在学习ASP.NET Core Blazor编程系列四——迁移这篇文章中我们通过EF Core提供的迁移功能,创建了数据库表。

       在学习ASP.NET Core Blazor编程系列五——列表页面这篇文章我们创建了图书列表页面,不过由于数据库中没有数据,我们的图书列表页面上也是一片空白没有数据显示。

       今天的这篇文章,我们将通过EF Core6提供的功能,向数据库表Book中添加初始数据。

 一、给数据库添加初始数据

        在Visual Studio 2022 的解决方案资源管理器中,使用鼠标左键选中Models文件,然后点击鼠标右键,在弹出菜单中选择“添加--》类”,创建一个新的类文件,命名为SeedData。具体代码如下:

 
  1. using Microsoft.EntityFrameworkCore;
  2. namespace BlazorAppDemo.Models
  3. {
  4.     public class SeedData
  5.     {
  6.         public static void Initialize(IServiceProvider serviceProvider)
  7.         {
  8.             using (var context = new BookContext(serviceProvider.<br>GetRequiredService<DbContextOptions<BookContext>>()))
  9.             {
  10.                 // Look for any Books.
  11.                 if (context.Book.Any())
  12.                 {
  13.                     return;   // DB has been seeded
  14.                 }
  15.                context.Book.AddRange(
  16.                     new Book
  17.                     {
  18.                         Name = "Python编程 从入门到实践",
  19.                         ReleaseDate = DateTime.Parse("2018-1-12"),
  20.                        Author = "埃里克·马瑟斯",
  21.                         Price = 75.99M,
  22.                         StockQty=10,
  23.                         Qty=0,
  24.                         TotalPages=445,
  25.                         Type=""
  26.                     },
  27.                     new Book
  28.                     {
  29.                         Name = "Java编程的逻辑",
  30.                         ReleaseDate = DateTime.Parse("2018-1-13"),
  31.                         Author = "马俊昌",
  32.                         Price = 48.99M,
  33.                           StockQty = 12,
  34.                         Qty = 0,
  35.                         TotalPages = 675,
  36.                         Type = ""
  37.                     },
  38.                     new Book
  39.                     {
  40.                         Name = "统计思维:大数据时代瞬间洞察因果的关键技能",
  41.                         ReleaseDate = DateTime.Parse("2017-12-23"),
  42.                         Author = "西内启",
  43.                         Price = 39.99M,
  44.                         StockQty = 20,
  45.                         Qty = 0,
  46.                         TotalPages = 330,
  47.                         Type = ""
  48.                     },
  49.                     new Book
  50.                     {
  51.                         Name = "微信营销",
  52.                         ReleaseDate = DateTime.Parse("2018-01-05"),
  53.                         Author = "徐林海",
  54.                         Price = 33.99M,
  55.                         StockQty = 30,
  56.                         Qty = 0,
  57.                         TotalPages = 266,
  58.                         Type = ""
  59.                     }
  60.                 );
  61.                 context.SaveChanges();
  62.            }
  63.         }
  64.      }<br>}
复制代码
     以下语句的作用是 如果数据库中有Book表,数据初始化类将返回,不添加任何数据。
  1.            // Look for any Books.
  2.                 if (context.Book.Any())
  3.                 {
  4.                     return;   // DB has been seeded
  5.                 }
复制代码
 二、添加SeedData.initializer方法

   1.在Visual Studio 2022 的解决方案资源管理器中打开Program.cs文件,然后找到Main方法,在这个方法体的最后面添加SeedData.Initialize()方法,代码如下:
  1. using BlazorAppDemo.Data;
  2. using BlazorAppDemo.Models;
  3. using Microsoft.AspNetCore.Components;
  4. using Microsoft.AspNetCore.Components.Web;
  5. using Microsoft.Extensions.Configuration;
  6. using Microsoft.EntityFrameworkCore;
  7. using Microsoft.Extensions.Hosting;
  8. var builder = WebApplication.CreateBuilder(args);
  9. // Add services to the container.
  10. builder.Services.AddRazorPages();
  11. builder.Services.AddServerSideBlazor();
  12. builder.Services.AddSingleton<WeatherForecastService>();
  13. System.Console.WriteLine(ConfigHelper.Configuration["ConnectionStrings:BookContext"]);
  14. builder.Services.AddDbContextFactory<BookContext>(opt =>
  15. opt.UseSqlServer(ConfigHelper.Configuration["ConnectionStrings:BookContext"]));
  16. var app = builder.Build();
  17. // Configure the HTTP request pipeline.
  18. if (!app.Environment.IsDevelopment())
  19. {
  20.     app.UseExceptionHandler("/Error");
  21.     // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  22.     app.UseHsts();
  23. }
  24. //数据库数据初始化
  25. using (var scope = app.Services.CreateScope())
  26. {
  27.     var services = scope.ServiceProvider;
  28.     try
  29.     {
  30.         Console.WriteLine("数据库开始初始化。");
  31.         var context = services.GetRequiredService<BookContext>();
  32.         // requires using Microsoft.EntityFrameworkCore;
  33.         context.Database.Migrate();
  34.         // Requires using BlazorAppDemo.Models;
  35.         SeedData.Initialize(services);
  36.         Console.WriteLine("数据库初始化结束。");
  37.     }
  38.     catch (Exception ex)
  39.     {
  40.         var logger = services.GetRequiredService<ILogger<Program>>();
  41.         logger.LogError(ex, "数据库数据初始化错误.");
  42.     }
  43. }
  44. app.UseHttpsRedirection();
  45. app.UseStaticFiles();
  46. app.UseRouting();
  47. app.MapBlazorHub();
  48. app.MapFallbackToPage("/_Host");
  49. app.Run();
复制代码
      2.在Visual Studio 2022中的菜单上选择“生成-->开始调试”,或按F5键。运行BlazorAppDemo应用程序。如下图。将进行数据库初始化。

 
三、测试应用程序

  1.在Visual Studio 2022中,打开“Pages\BookIndex.razor”文件,在此文件的顶部,输入@inject IDbContextFactory dbFactory,注入数据库上下文。

   2.在@code中重写OnInitializedAsync方法 ,在组件呈现时,去查询数据库中的Book表中的数据,最终呈现在页面上。具体代码如下。
  1. @page "/BookIndex"
  2. @using BlazorAppDemo.Models
  3. @using Microsoft.EntityFrameworkCore
  4. @inject IDbContextFactory<BookContext> dbFactory
  5. <PageTitle>图书列表</PageTitle>
  6. <h3>图书列表</h3>
  7. <table class="table-responsive" width="90%">
  8.     <tr><td>Name</td>
  9.     <td>Author</td>
  10.     <td>Price</td>
  11.     <td>ReleaseDate</td>
  12.     <td>StockQty</td>
  13.     <td>Qty</td>
  14.     </tr>
  15.     @foreach (var item in books)
  16.     {
  17.         <tr>
  18.         <td>@item.Name</td>
  19.         <td>@item.Author</td>
  20.         <td>@item.Price</td>
  21.         <td>@item.ReleaseDate</td>
  22.         <td>@item.StockQty</td>
  23.         <td>@item.Qty</td>
  24.         </tr>
  25.     }
  26. </table>
  27. @code {
  28.     private   static BookContext _context;
  29.     private List<Book> books = new List<Book>();
  30.     protected override async Task OnInitializedAsync()
  31.     {
  32.         _context = dbFactory.CreateDbContext();
  33.         books=_context.Book.ToList();
  34.         await base.OnInitializedAsync();
  35.     }
  36. }
复制代码
3. 在Visual Studio 2022中的菜单上选择“生成à开始调试”,或按F5键。运行BlazorAppDemo应用程序。使用鼠标右键点击浏览器中左边的菜单栏中的“图书列表”菜单,在浏览器中显示图书信息。如下图。

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表