[[oktatas:programozas:csharp:dotnetcore:web_api|< Web API]] ====== .Net Core Web SQLite ====== * **Szerző:** Sallai András * Copyright (c) 2022, Sallai András * Szerkesztve: 2022, 2023, 2024 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Előkészítés ===== dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.EntityFrameworkCore.Sqlite dotnet add package Microsoft.Extensions.PlatformAbstractions * A Design a migrációs fájl készítéséhez szükséges. * A PlatformAbstractions csak azért kell, hogy kiderítsük a projekt útvonalát. net6.0 enable enable runtime; build; native; contentfiles; analyzers; buildtransitive all ===== Program.cs ===== global using App01.Data; global using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.PlatformAbstractions; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddDbContext(options => { var path = PlatformServices.Default.Application.ApplicationBasePath; options.UseSqlite("Filename=" + Path.Combine(path, "database.db")); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); A Data és Microsoft.EntityFrameworkCore a global kulcsszóval lett megadva, így a DataContextben és az EmployeeControllerben nem szükséges megadni: global using App01.Data; global using Microsoft.EntityFrameworkCore; ===== DataContext ===== namespace App01.Data { public class DataContext : DbContext { public DbSet Employees { get; set; } = null!; public DataContext(DbContextOptions options) : base(options) {} } } A null! a következő figyelmeztetés elkerülésére való: Non-nullable property 'Employees' must contain a non-null value when exiting constructor. ===== Migráció ===== Migrációs fájlok létrehozása: dotnet ef migrations add InitialCreate Adatbázis fájl létrehozása a táblákkal együtt. dotnet ef database update A database.db a következő helyen jön létre: bin/Debug/net6.0 ===== Kontroller ===== 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()); } } } ===== Az adatbázisfájl a projekt alapkönyvtárába ===== { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "ConnectionStrings": { "DefaultConnection": "DataSource=app.db" } } global using Microsoft.EntityFrameworkCore; global using App01.Data; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddDbContext(options => { var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); options.UseSqlite(connectionString); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); Így nincs szükség a Microsoft.Extensions.PlatformAbstractions függőségre. ===== Példa migráció nélkül ===== ==== Projekt létrehozása ==== dotnet new webapi -n sqlitepelda code -r sqlitepelda Ebben a példában nem használunk adatbázis migárciót. ==== Telepítés ==== dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 7.0.10 dotnet add package Microsoft.EntityFrameworkCore ==== SQLite fájl neve ==== { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "database": "database" } } ==== SQLite adatbázis beépítése ==== //... builder.Services.AddDbContext(options => { var config = builder.Configuration; var connectionString = config.GetConnectionString("database"); options.UseSqlite($"Data Source={connectionString}.db"); }); //... ==== Adatbázis és modell kötése ==== using hello.Models; using Microsoft.EntityFrameworkCore; namespace hello.Data; public class Database: DbContext { public DbSet Employees { get; set; } = null!; public Database(DbContextOptions options): base(options) {} } ==== Kontroller ==== dotnet-aspnet-codegenerator controller -name EmployeeController -outDir Controllers -api using hello.Data; using hello.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace hello.Controllers { [Route("api/[controller]")] [ApiController] public class EmployeeController : ControllerBase { private readonly Database _database; public EmployeeController(Database database) { _database = database; } [HttpGet] public async Task>> Get() { return Ok(await _database.Employees.ToListAsync()); } } } ==== Model létrehozása ==== namespace hello.Models; public class Employee { public int Id { get; set; } public string? Name { get; set; } public string? City { get; set; } public double Salary { get; set; } } ==== Hozzuk létre az SQLite adatbázist ==== Például sqlite3 shellben: create table employees ( id integer not null primary key autoincrement, name text, city text, Salary real ); A Dotnet Core alkalmazás olyan néven keresi a táblát és a mezőneveket, amit a modellben megadtunk, esetünkben az Employee.cs fájlban. A kis- és nagybetűt azonban nem veszi figyelembe, így az adatbázisban lehetnek akár kisbetűvel is. ==== Tesztelés ==== HTTPie teszt: http http://localhost:5214/api/employee