使用EF Core创建webapi接口(二)

有错误欢迎大家给我指正

说明:***core webapi+***6+EF Core版本,codefirst模式(代码创建数据库)

1.***core webapi+***6+EF Core版本,dbfirst模式(代码生成数据库)见:使用EF Core创建webapi接口(一)-CSDN博客

2.***core webapi+***6+EF Core+vue前后端联动版本,见***core webapi+***6+EF Core+vue3前后端联动-CSDN博客

3.***core webapi+***6+sqlsugar+vue2前后端联动版本,见Sqlsugar+vue2实现增删改查,分页查询,***6实现_.*** core 6.0 sqlsugar-CSDN博客

1.创建***core weiapi+***6项目

2.安装nuget包

Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools

注意,最新版本只支持***8.0,需要降级到7版本就行

3.创建实体类

上方创建的数据库中的表名为Daily,所以在此处也创建相同名字的实体类,以便区分

public class Daily
{
    public int Id { get; set; }
    public string Title { get; set; }
}

 创建页数类

public class Page
{
    public int PageIndex { get; set; } // 当前页码
    public int PageSize { get; set; } // 每页记录数
}

创建修改的内容类

public class Addreq
{
    public string Title { get; set; }
}

4.创建上下文

public class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options)
        : base(options)
    {
    }
    //定义数据集合:用于创建表
    public DbSet<Daily> Daily { get; set; }

    // 此方法将在数据库第一次创建时自动调用
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Daily>().Property(e => e.Id).ValueGeneratedOnAdd();
        // 添加初始种子数据
        //EF Core 要求种子数据的主键属性是非零值。
        //默认情况下,EF Core 认为主键为零的实体是要插入到数据库中的新实体,
        //而不是种子数据
        //可以将种子数据的 Id 属性值设置为负数或其他非零值,以避免与非种子数据发生冲突
        modelBuilder.Entity<Daily>().HasData(
            new Daily { Id = -1, Title = "Daily 1" },
            new Daily { Id = -2, Title = "Daily 2" }
        );
    }

5.连接数据库字符串

这是我的

"ConnectionStrings": {
  "MyContext": "Server=.;DataBase=demo1;uid=sa;pwd=123456;TrustServerCertificate=true"
},

TrustServerCertificate=true 的作用是告诉 SQL Server 客户端在建立与服务器的 SSL 连接时信任自签名或无效证书

添加到appsetting.json,全文如下

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.Asp***Core": "Warning"
    }
  },
  "ConnectionStrings": {
    "MyContext": "Server=.;DataBase=数据库名;uid=账号;pwd=密码;TrustServerCertificate=true"
  },
  "AllowedHosts": "*"
}

6.添加映射关系

builder.Services.AddDbContext<MyContext>
    (opt =>
    {
        string connectionString = builder.Configuration.GetConnectionString("MyContext");
        opt.UseSqlServer(connectionString);
    });

必须写在var app = builder.Build();前面,因为:

在构建应用程序之后,无法修改 ServiceCollection, 确保在调用 Build() 方法之前,所有的服务配置代码已经完成,并且没有额外的试图修改 ServiceCollection 的代码,所以连接数据库服务必须写在这

添加到Program.cs,全文如下

using Microsoft.EntityFrameworkCore;
using todo.Service;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/asp***core/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<MyContext>
    (opt =>
    {
        string connectionString = builder.Configuration.GetConnectionString("MyContext");
        opt.UseSqlServer(connectionString);
    });
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

//可跨域,以便前端使用接口
app.UseCors(t => t.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());

app.UseAuthorization();

app.MapControllers();

app.Run();

7.生成数据库

工具-nuget包管理器-程序包管理器控制台

输入add-migration init

update-database

没有报错,可以到数据库查看是否生成成功,成功后进行下一步

8.添加控制器,并实现增删改查

注意,这些代码只是实现了简单的增删改查,没有添加如非空判断和其他错误判断

 [Route("api/[controller]")]
 public class TodoController : ControllerBase
 {
     private readonly MyContext context;
     public TodoController(MyContext context)
     {
         this.context = context;
     }
     [HttpGet]
     public IEnumerable<Daily> GetAll()
     {
         if (!context.Daily.Any())
         {
             return (IEnumerable<Daily>)Enumerable.Empty<string>().Append("无数据");
         }
         return context.Daily.ToList();
     }
     [HttpGet("分页查询数据")]
     public IActionResult GetByPage([FromQuery] Page page)
     {
         //查询上下文中Daily实体的查询
         var query = context.Daily;

         //这是一系列LINQ方法,用于对查询结果进行分页操作。
         //Skip方法用于跳过指定数量的元素,
         //Take方法用于选择指定数量的元素,
         //ToList方法用于将查询结果转换为List集合。
         var userList = query.Skip((page.PageIndex - 1) * page.PageSize)
                 .Take(page.PageSize)
                 .ToList();
         //统计了Daily实体的总数
         var totalCount = context.Daily.Count();

         var result = new
         {
             TotalCount = totalCount,//数据总数
             Data = userList
         };

         return Ok(result);
     }
     [HttpPost("添加数据")]
     public IActionResult Create(Addreq req)
     {
         if (req.Title == null)
         {
             //如果绑定失败或传入的对象为空,
             //方法会返回一个 HTTP 400 Bad Request 响应
             return BadRequest();
         }
         Daily info = new Daily()
         {
             //生成一个唯一的哈希码作为ID,不使用则按照定义的自增增加
             //Id = Math.Abs(Guid.NewGuid().GetHashCode()),
             Title = req.Title
         };
         context.Daily.Add(info);
         context.SaveChanges();

         return Ok(info);
     }
     [HttpPut("修改数据")]
     public IActionResult Update(int id, [FromBody] Daily updatedDaily)
     {
         var daily = context.Daily.FirstOrDefault(m => m.Id == id);
         if (daily != null)
         {
             daily.Title = updatedDaily.Title;
             context.SaveChanges();
         }

         return Ok();
     }
     [HttpDelete("删除数据")]
     public IActionResult Delete(int id)
     {
         var daily = context.Daily.Find(id);
         if (daily == null)
         {
             return NotFound();
         }

         context.Daily.Remove(daily);
         context.SaveChanges();

         return NoContent();
     }
 }

转载请说明出处内容投诉
CSS教程_站长资源网 » 使用EF Core创建webapi接口(二)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买