[[oktatas:programozas:csharp:dotnetcore:web_api|< Web API]] ====== .Net Core Web Entity Framework ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2022 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Bevezetés ===== A Entity Framework Core könnyed hozzáférést biztosít az adatbázisokhoz. Parancssoros eszköz használatához segítség: * https://docs.microsoft.com/en-us/ef/core/cli/dotnet ===== Előkészítés ===== dotnet tool install --global dotnet-ef Adott verzió telepítése: dotnet tool install --global dotnet-ef --version 3.0 dotnet tool install --global dotnet-ef --version 5.0 dotnet tool install --global dotnet-ef --version 6.0 dotnet tool install --global dotnet-ef --version 7.0 dotnet tool install --global dotnet-ef --version 8.0 A parancsot felhasználóként kell kiadni Linuxon és Windowson is. ==== Hova telepszik? ==== * Linux/macOS $HOME/.dotnet/tools * Windows %USERPROFILE%\.dotnet\tools ==== Linuxos Shellek ==== A dotnet-ef útvonalba helyezése: Bash, zsh, csh vagy tcsh shell esetén: bash/zsh: export PATH="$PATH:$HOME/.dotnet/tools/" csh/tcsh: set path = ($path $HOME/.dotnet/tools/) ===== Függőségek ===== Adjuk a projekthez a függőségeket: dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.EntityFrameworkCore dotnet add package Pomelo.EntityFrameworkCore.MySql * A Design kell a migrációs fájlok készítéséhez. Nem működnek: A MySql.EntityFrameworkCore és MySql.Data.EntityFramework nem működik. Helyette ezt használjuk: Pomelo.EntityFrameworkCore.MySql Info: * https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql#2-services-configuration Ha már van újabb keretrendszer, de nálunk például még csak 7.x van: dotnet add package Microsoft.EntityFrameworkCore.Design --version 7.0 dotnet add package Microsoft.EntityFrameworkCore --version 7.0 dotnet add package Pomelo.EntityFrameworkCore.MySql --version 7.0 ===== Kapcsolat ===== { "ConnectionStrings": { "DefaultConnection": "server=localhost;user=muni;password=titok;database=muni" } } global using App01.Data; global using Microsoft.EntityFrameworkCore; global using Pomelo.EntityFrameworkCore.MySql; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddDbContext(options => { var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); var serverVersion = new MySqlServerVersion(new Version(8, 0, 27)); options.UseMySql(connectionString, serverVersion); }); //... ===== DataContext ===== using Microsoft.EntityFrameworkCore; namespace App01.Data { public class DataContext : DbContext { } } using Microsoft.EntityFrameworkCore; using Pomelo.EntityFrameworkCore.MySql; namespace App01.Data { public class DataContext : DbContext { public DbSet Employees { get; set; } = null!; public DataContext(DbContextOptions options) : base(options) {} } } Migrációs fájlok készítése: dotnet ef migrations add InitialCreate Tábla létrehozása: dotnet ef database update ===== API adatbázishoz kötése ===== using Microsoft.AspNetCore.Mvc; namespace App01.Controllers { [Route("api/[controller]")] [ApiController] public class EmployeeController : ControllerBase { private readonly DataContext _context; public EmployeeController(DataContext context) { _context = context; } [HttpGet] public async Task>> Get() { return Ok(await _context.Employees.ToListAsync()); } [HttpGet("{id}")] public async Task>> Get(int id) { var dbEmployee = await _context.Employees.FindAsync(id); if (dbEmployee == null) { return BadRequest("A dolgozó nem található"); } return Ok(dbEmployee); } [HttpPost] public async Task>> AddEmployee(Employee employee) { _context.Employees.Add(employee); await _context.SaveChangesAsync(); return Ok(await _context.Employees.ToListAsync()); } [HttpPut] public async Task>> UpdateEmployee(Employee request) { var dbEmployee = await _context.Employees.FindAsync(request.Id); if (dbEmployee == null) { return BadRequest("A dolgozó nem található"); } dbEmployee.Name = request.Name; dbEmployee.City = request.City; dbEmployee.Salary = request.Salary; await _context.SaveChangesAsync(); _context.Employees.Remove(dbEmployee); await _context.SaveChangesAsync(); return Ok(await _context.Employees.ToListAsync()); } [HttpDelete("{id}")] public async Task>> Delete(int id) { var dbEmployee = await _context.Employees.FindAsync(id); if (dbEmployee == null) { return BadRequest("A dolgozó nem található"); } _context.Employees.Remove(dbEmployee); await _context.SaveChangesAsync(); return Ok(await _context.Employees.ToListAsync()); } } } ===== GitHub ===== * https://github.com/andteki/muni