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

  • 相关阅读:
    转:Git: git stash 用法小结
    Checkbox: ListView 与CheckBox 触发事件冲突的问题
    android: getDimension, getDimensionPixelOffset 和getDimensionPixelSize 区别
    java: 保留两位小数4种方法
    java: 保留两位小数4种方法
    转:在eclipse中 使用7.0及以上手机进行测试时logcat不打印日志的解决办法
    转:Android文件存储路径getFilesDir()与getExternalFilesDir的区别
    Gradle-修改.gradle默认目录
    Windows: 打开关闭网络连接的方法
    dom4j: 生成XML时文本中回车换行无效
  • 原文地址:https://www.cnblogs.com/gxsxc/p/10826891.html
Copyright © 2011-2022 走看看