EF Core的集成

Program.cs常用API解析

我们新建ASP.NET Core项目时,会自动生成这样一个入口文件,这里配置很多东西,但是我们也会有很多疑问,这些API到底是干啥的

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}
//添加用于将 HTTP 请求重定向到 HTTPS 的中间件。
app.UseHttpsRedirection();
//为当前请求路径启用静态文件服务
app.UseStaticFiles();

app.UseAuthorization();
//向与指定模式的 HTTP GET 请求匹配的项添加一个RouteEndpointIEndpointRouteBuilder。
app.MapGet("/hi", () => "Hello!");
//向控制器操作 IEndpointRouteBuilder 添加终结点,并添加默认路由 {controller=Home}/{action=Index}/{id?}。
app.MapDefaultControllerRoute();
//将 Razor Pages 的终结点添加到 IEndpointRouteBuilder.
app.MapRazorPages();

app.Run();

好,现在从第一句var builder = WebApplication.CreateBuilder(args);来看,首先是WebApplication

  • WebApplication

    • 用于配置 HTTP 管道和路由的 Web 应用程序,以下是WebApplication

在这里插入图片描述

  • 详细的API可以去文档查看 WebApplication 类 (Microsoft.AspNetCore.Builder) | Microsoft Learn

  • 这里主要介绍下CreateBuilder()方法和Run()

    • CreateBuilder()

      • 这个方法如图,返回一个WebApplicationBuilder对象,它是Web 应用程序和服务的生成器,主要用来注册服务,和配置依赖注入等

      •     //
            // 摘要:
            //     A builder for web applications and services.
            public sealed class WebApplicationBuilder
            {
             
                public IWebHostEnvironment Environment { get; }
                
                //要撰写的应用程序的服务集合,比如我们Program.cs里面注册的
                //builder.Services.AddRazorPages();
        		//builder.Services.AddControllersWithViews();
                public IServiceCollection Services { get; }
               
                //要撰写的应用程序的配置提供程序的集合,
                public ConfigurationManager Configuration { get; }
                
               //应用程序要撰写的日志记录提供程序的集合。 这对于添加新日志记录提供程序非常有用。
                public ILoggingBuilder Logging { get; }
               
                //IWebHostBuilder用于配置服务器特定属性,但不生成。 若要在配置后生成,请调用 Build()。
                public ConfigureWebHostBuilder WebHost { get; }
                //用于 IHostBuilder 配置主机特定属性,但不生成。 若要在配置后生成,请调用 Build()。
                public ConfigureHostBuilder Host { get; }
           
                //只有这个方法,这个方法的返回值是WebApplication,在配置完成后调用来启动程序
                public WebApplication Build();
            }
        
    • Run()方法

      • 运行应用程序并阻止调用线程,直至主机关闭。

EF Core在分层项目中的使用

项目结构

在这里插入图片描述

  • 步骤

    • 建立类库项目,放实体类,DbContext,配置类等,DbContext中不配置数据库连接,而是为了DbContext增加一个DbContextOptions类型的构造函数,需要通过NuGet为项目安装Microsoft.EntityFrameworkCore

      •     public class Book
            {
                public long Id { get; set; }
                public string Title { get; set; }
                public string AuthorName { get; set; }
                public double Price { get; set; }
                public DateTime PubDate { get; set; }
            }
            public class BookConfig : IEntityTypeConfiguration<Book>
            {
                public void Configure(EntityTypeBuilder<Book> builder)
                {
                    builder.ToTable("T_Books");
                }
            }
            public class MyDbContext:DbContext
            {
                
        
                public DbSet<Book> Books { get; set; }
                public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
                {
                }
                //创建上下文
                protected override void OnModelCreating(ModelBuilder modelBuilder)
                {
                    base.OnModelCreating(modelBuilder);
                    //从提供程序集中定义的所有 IEntityTypeConfiguration<TEntity> /> 实例应用配置。
                    modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
                }
        
                    
            }
        
    • EF Core项目安装对应数据库的EF Core Provider

      • Instal-Package Microsoft.EntityFrameworkCore.SqlServer
      • Instal-Package Microsoft.EntityFrameworkCore.Tools
    • ASP.NET Core项目引用EF Core项目,并且通过AddDbContext来注入DbContext及对DbContext进行配置

      • 这里保存数据连接字符串是在是在机密文件中secrets.json

        • {
            "ConnStr": "Data Source=.;Initial Catalog=demo666;Integrated Security=SSPI;TrustServerCertificate=yes"
          }
          
      • 对DbContext的配置是在Program.cs中

        •     builder.Services.AddDbContext<MyDbContext>(opt =>
              {
                  string? connStr = builder.Configuration.GetSection("ConnStr").Value;
                  opt.UseSqlServer(connStr);
              });
              var app = builder.Build();
          
    • Controller中就可以注入DbContext类中使用了

      •     [Route("api/[controller]/[action]")]
            [ApiController]
            public class TestController : ControllerBase
            {
                private readonly MyDbContext myDbContext;
                    
                public TestController(MyDbContext myDbContext)
                {
                    this.myDbContext = myDbContext;
                }
        
        
                [HttpGet]
                public string Demo1()
                {
                    int c = myDbContext.Books.Count();
                    return $"c={c}";
                }
            }
        
    • 让开发环境的Add-Migration知道连接哪个数据库在EFCore项目中创建一个实现了IDesignTimeDbContextFactory的类并且在CreateDbContext返回一个连接开发数据库的DbContext

      •     public class MyDbContextDesignFac : IDesignTimeDbContextFactory<MyDbContext>
            {
                public MyDbContext CreateDbContext(string[] args)
                {
                    DbContextOptionsBuilder<MyDbContext> options = new DbContextOptionsBuilder<MyDbContext>();
        
                    string connStr = "Data Source=.;Initial Catalog=demo666;Integrated Security=SSPI;TrustServerCertificate=yes";
                    options.UseSqlServer(connStr);
                    MyDbContext myDbContext = new MyDbContext(options.Options);
                    return myDbContext;
                }
            }
        
    • 执行数据库迁移,Add-Migration Update-database,需要把EF Core项目设置为启动项目,需要安装一些包

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栀梦星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值