[[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