El enfoque de este proyecto fue una implementación simple de API mínima con el marco SQL Lite y Entity .

EntityFramework
Flunt
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Tools
Swashbuckle.AspNetCore
En la clase del programa se configuró una base de datos, entrada y salida JSON, repositorio de SQL Lite y Swagger.
//builder config
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MovieDbContext>(op =>
op.UseSqlite("DataSource=app.db;Cache=Shared"));
builder.Services.Configure<JsonOptions>(opt =>
opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));
builder.Services.AddEndpointsApiExplorer().AddSwaggerGen();
builder.Services.AddScoped<MovieRepository>();
//app config
var app = builder.Build();
app.UseSwagger().UseSwaggerUI();
Los puntos finales se implementaron en la clase de programa.
app.MapGet("/movie", (MovieRepository repository) =>
{
var movies = repository.Get();
return Results.Ok(movies.Select(m => (MovieResponse)m));
}).Produces<IEnumerable<Movie>>(StatusCodes.Status200OK);
app.MapGet("/movie/{id}", (MovieRepository repository, Guid id) =>
{
var movie = repository.Get(id);
if (movie is null)
return Results.NotFound();
return Results.Ok((MovieResponse)movie);
}).Produces<Movie>(StatusCodes.Status200OK)
.Produces(StatusCodes.Status404NotFound);
app.MapPost("/movie", (MovieRepository repository, CreateMovieRequest request) =>
{
Movie movie = request;
if (!request.IsValid)
return Results.BadRequest(request.Notifications);
repository.Create(movie);
return Results.Created("/movie", (MovieResponse)movie);
}).Produces<Movie>(StatusCodes.Status201Created)
.Produces(StatusCodes.Status400BadRequest);
app.MapDelete("/movie/{id}", (MovieRepository repository, Guid id) =>
{
var movie = repository.Get(id);
if (movie is null)
return Results.NotFound();
repository.Delete(movie);
return Results.Accepted();
}).Produces(StatusCodes.Status202Accepted)
.Produces(StatusCodes.Status404NotFound);
Después de implementar los puntos finales, necesitamos ejecutar la aplicación.
app.Run();
La validación de la solicitud se realizó con el paquete Flunt de la siguiente manera:
public class CreateMovieRequest : Notifiable<Notification>
{
public string Name { get; set; }
public DateTime Released { get; set; }
[JsonConverter(typeof(JsonStringEnumConverter))]
public Genre Genre { get; set; }
public static implicit operator Movie(CreateMovieRequest request)
{
var contract = new Contract<Notification>()
.Requires()
.IsNotNull(request.Name, "Name is null")
.IsLowerOrEqualsThan(request.Released, DateTime.UtcNow, "Invalid date");
request.AddNotifications(contract);
return new Movie(Guid.NewGuid(), request.Name, request.Released, request.Genre);
}
}
La implementación de SQL Lite se realizó con el primer enfoque del código de marco de entidad.
Implementación de DBContext:
public class MovieDbContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
public MovieDbContext(DbContextOptions<MovieDbContext> options) : base(options) { }
}
Implementación de uso de la base de datos:
public class MovieRepository
{
public MovieDbContext _dbContext { get; set; }
public MovieRepository(MovieDbContext movieDbContext)
{
_dbContext = movieDbContext;
}
public IEnumerable<Movie> Get() =>
_dbContext.Movies.ToArray();
public Movie Get(Guid id) =>
_dbContext.Movies.FirstOrDefault(c => c.Id == id);
public Movie Create(Movie movie)
{
_dbContext.Movies.Add(movie);
_dbContext.SaveChanges();
return movie;
}
public void Delete(Movie movie)
{
_dbContext.Movies.Remove(movie);
_dbContext.SaveChanges();
}
}
La migración fue creada y aplicada en la consola del administrador de paquetes con los siguientes comandos
Add-Migration InitialMigration
Update-Database
Si encontró esta implementación útil o la usó en sus proyectos, dale una estrella. ¡Gracias!