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