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的时间不长,还没有太深入的使用,简单学习记录,有错误和建议的话还望指正~