EF有两个不同版本,即Entity Framework Core 和 Entity Framework 6
EF Core:轻量级,可扩展,跨平台,参考EF6,全新平台,学习曲线小,引入一些新功能(批量删除)
EF 6 :笨重,稳定,微软已经不打算进行大版本升级,无法跨平台。
如何实现EF Core功能
1、创建ASP.NET Core Web应用程序
2、新建TodoItem类
首先新建文件夹>Models
在Models里添加TodoItem类
1 public class TodoItem 2 { 3 public long Id { get; set; } 4 public string Name { get; set; } 5 public bool IsComplete { get; set; } 6 }
3、添加数据库上下文
选择管理NuGet程序包
选择“浏览”选项卡,然后在搜索框中输入 Microsoft.EntityFrameworkCore.SqlServer
在左窗格中选择“Microsoft.EntityFrameworkCore.SqlServer” 。
选中右窗格中的“项目”复选框,然后选择“安装” 。
使用上述说明再次添加 Microsoft.EntityFrameworkCore.InMemory
两个NuGet安装完成后,然后在Models里新建TodoContext类。
public class TodoContext : DbContext { public TodoContext(DbContextOptions<TodoContext> options) : base(options) { } public DbSet<TodoItem> TodoItems { get; set; } }
4、注册数据库上下文
在appsettings.json启动配置文件中创建连接sqlserver数据库的语句
"ConnectionStrings": { "todoContext": "server=.;database=TodoDatas;uid=sa;pwd=123456" }
转到Startup类,实现Startup类的构造方法,在ConfigureServices注册数据库上下文
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // 该方法在运行时被调用。 // 可以使用该方法将服务添加到容器中 例如 ASP.NET Core MVC 、 Entity Framework Core 和 Identity // 更多信息配置应用程序的信息,可以查看 https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { //使用sqlserver数据库 services.AddDbContext<TodoContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("todoContext"))); services.AddControllers(); } // 该方法在运行时被调用 // 可以使用该方法来配置 HTTP 请求管道/用于定义请求管道中的中间件 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
5、 安装迁移包—通过代码生成数据库(sqlserver)
打开程序包管理控制台
输入:Add-Migration InitDatabase
输入:update-database 生成数据库
6、添加控制器
新建文件夹>Controllers
在Controllers里添加TodoController控制器
namespace TodoApi.Controllers { //如果访问的路径为404则需要配置路由 [Route("api/[controller]")] [ApiController] public class TodoController : Controller { private readonly TodoContext _context; public TodoController(TodoContext context) { _context = context; if (_context.TodoItems.Count() == 0) { // 如果集合为空,则创建新的 TodoItem, // which means you can't delete all TodoItems. _context.TodoItems.Add(new TodoItem { Name = "Item1" }); _context.SaveChanges(); _context.TodoItems.Add(new TodoItem { Id = 1, Name = "Item1", IsComplete = false }); _context.TodoItems.Add(new TodoItem { Id = 2, Name = "Item2", IsComplete = false }); _context.TodoItems.Add(new TodoItem { Id = 3, Name = "Item3", IsComplete = true }); _context.SaveChanges(); } } [HttpGet] public IEnumerable<TodoItem> GetAll() { return _context.TodoItems.ToList(); } } }
访问页面为4.4则需要设置路由
转到launchSettings.json,添加"launchUrl":"api/Todo"
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:54029", "sslPort": 44320 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "api/Todo", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "TodoApi": { "commandName": "Project", "launchBrowser": true, "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
7、增删改查
namespace TodoApi.Controllers { //如果访问的路径为404则需要配置路由 [Route("api/[controller]")] [ApiController] public class TodoController : Controller { private readonly TodoContext _context; public TodoController(TodoContext context) { _context = context; if (_context.TodoItems.Count() == 0) { // 如果集合为空,则创建新的 TodoItem, // which means you can't delete all TodoItems. _context.TodoItems.Add(new TodoItem { Name = "Item1" }); _context.SaveChanges(); _context.TodoItems.Add(new TodoItem { Name = "Item1", IsComplete = false }); _context.TodoItems.Add(new TodoItem { Name = "Item2", IsComplete = false }); _context.TodoItems.Add(new TodoItem { Name = "Item3", IsComplete = true }); _context.SaveChanges(); } } [HttpGet] public IEnumerable<TodoItem> GetAll() { return _context.TodoItems.ToList(); } /// <summary> /// 根据Id查找数据 /// </summary> /// <param name="Id">序号</param> /// <returns></returns> [HttpGet("{Id}")] public async Task<TodoItem> GetByID(int Id) { var item = await _context.TodoItems.FirstOrDefaultAsync(t => t.Id == Id); return item; } /// <summary> /// 创建 /// </summary> /// <param name="item"></param> /// <returns></returns> [HttpPost] public async Task<IActionResult> Create([FromBody] TodoItem item) { if (item == null) { return BadRequest(); } else { _context.TodoItems.Add(item); await _context.SaveChangesAsync(); return Ok(item); } } /// <summary> /// 修改 /// </summary> /// <param name="Id"></param> /// <param name="item"></param> /// <returns></returns> [HttpPut("{id}")] public async Task<IActionResult> Update(int id, [FromBody] TodoItem item) { if (item == null) { return BadRequest(); } else { var todo = _context.TodoItems.SingleOrDefault(t => t.Id == id); if (todo == null) { return NotFound(); } else { todo.IsComplete = item.IsComplete; todo.Name = item.Name; _context.TodoItems.Update(todo); await _context.SaveChangesAsync(); return Ok(todo); } } } /// <summary> /// 删除 /// </summary> /// <param name="Id"></param> /// <returns></returns> [HttpDelete("{Id}")] public async Task<IActionResult> Delete(int Id) { var todo = _context.TodoItems.SingleOrDefault(t => t.Id == Id); if (todo == null) { return NotFound(); } else { _context.TodoItems.Remove(todo); await _context.SaveChangesAsync(); return Ok(); } } } }
运行效果展示
8、使用swagger
Swagger兼具了API文档管理和测试的功能
打开程序包管理控制台
输入:Install-Package Swashbuckle.AspNetCore
安装成功后转到Startup类,要将swagger middle添加到请求管道,需要在startup类的ConfigureServices方法中添加swaggergen方法,
如果要启用这个中间件,我们还需要在startup类的Configure方法中调用useswagger方法。
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // 该方法在运行时被调用。 // 可以使用该方法将服务添加到容器中 例如 ASP.NET Core MVC 、 Entity Framework Core 和 Identity // 更多信息配置应用程序的信息,可以查看 https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { //使用sqlserver数据库 services.AddDbContext<TodoContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("todoContext"))); services.AddControllers(); services.AddMvcCore(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); }); } // 该方法在运行时被调用 // 可以使用该方法来配置 HTTP 请求管道/用于定义请求管道中的中间件 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
输入路径:https://localhost:44320/swagger/index.html
效果展示
后续会陆续更新其他资料,喜欢请关注哦!