ASP.NET Core MVC中Hangfire及EF Core的简单使用

项目中可能要实现定时读写数据,所以了解了一下Hangfire,并简单尝试使用,同时又实践了一波EF Core的DB First模式

Hangfire

1.新建ASP.NET Core项目

2.Nuget安装Hangfire的包,因为我Hangfire配置用数据库使用的PostgreSql,所以添加的pg相关的引用,Hangfire官方支持SQL Server和Redis

3.在Startup.cs的ConfigureServices方法中注入Hangfire服务,数据库连接字符串配置在appsettings.json的ConnectionStrings中,我这里名称是“HangfireConnection”

services.AddHangfire(x => x.UsePostgreSqlStorage(Configuration.GetConnectionString("HangfireConnection")));

Configure方法中配置使用Hangfire,可配置项有很多,这里是简单使用所以不涉及

app.UseHangfireServer();//启用Hangfire服务
app.UseHangfireDashboard();//启用Hangfire面板

4.定时循环处理一个方法,时间间隔一分钟。延时任务支持到秒级,循环任务只支持到分钟。

RecurringJob.AddOrUpdate<IJobService>(x => x.TestFunc(), Cron.Minutely);

EF Core

上面Hangfire中循环执行的TestFunc中需要获取数据库中的数据,因为数据库已经有了,所以试了下EF Core的DB First使用,从前使用EF时Code First模式居多

1.新建.NET Core工程,添加EF Core相关引用

我需要连接两个库,有SQL Server的,也有PostgreSQL的

2.在程序包管理控制台输入命令,以连接SQL Server为例,ConnectionString为数据库连接字符串,注意执行前要选对工程

Scaffold-DbContext -Connection "ConnectionString" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "Models"

执行成功后生成Models文件夹,里面是Model类

3.这种情况下连接字符串是直接配置在生成的数据上下文类OnConfiguring方法中的,为了方便一般将它配置在appsettings.json中,然后通过services.AddDbContext注入

services.AddDbContext<SPDContext>(options => options.UseNpgsql(Configuration.GetConnectionString("SPDConnection")));
services.AddDbContext<HRWL_DB_ZSzxyyContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection")));

4.在接口实现中使用时,这里是构造注入,不再像以前一样每次new一个dbcontext的对象

public class JobService : IJobService
{
      public SPDContext _spdcontext { get; }

      public JobService(SPDContext spdcontext)
      {
          _spdcontext = spdcontext;
      }
      public void TestFunc()
      {
          _spdcontext.Goodshelf.Add(new Goodshelf
          {
              Shelfname = "TestData"
          });
          _spdcontext.SaveChanges();
      }
}

5.另外一个需求是查询视图,EF Core 2.1才开始支持对没有主键的表和视图进行映射,来自官方文档:

在上下文中定义视图时用DbQuery而不是DbSet,只能查询不能增删改

public virtual DbQuery<ERPSPDBianma> ERPSPDBianma { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Query<ERPSPDBianma>().ToView("View_ERP_SPD_BianMa");
}

然后像其他表一样正常使用

var entity = _sscontext.ERPSPDBianma.OrderBy(x => x.WYPBianMa).FirstOrDefault(x => string.Compare(x.WYPBianMa, _bianma) > 0);

我接触EF的时间不长,还没有太深入的使用,简单学习记录,有错误和建议的话还望指正~

原文地址:https://www.cnblogs.com/gxsxc/p/10826891.html