dotnet-cqrs/docs/tutorials/modular-solution/04-dal-layer.md

1.8 KiB

DAL Layer

Set up Entity Framework Core and repositories.

DbContext

// OrderManagement.Infrastructure/Data/OrderDbContext.cs
using Microsoft.EntityFrameworkCore;
using OrderManagement.Domain.Entities;

public class OrderDbContext : DbContext
{
    public DbSet<Order> Orders => Set<Order>();

    public OrderDbContext(DbContextOptions<OrderDbContext> options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Order>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.TotalAmount).HasPrecision(18, 2);
            entity.OwnsMany(e => e.Items, items =>
            {
                items.Property(i => i.Price).HasPrecision(18, 2);
            });
        });
    }
}

Repository

// OrderManagement.Infrastructure/Repositories/OrderRepository.cs
public interface IOrderRepository
{
    Task<Order> GetByIdAsync(int id, CancellationToken ct);
    Task AddAsync(Order order, CancellationToken ct);
    Task SaveChangesAsync(CancellationToken ct);
}

public class OrderRepository : IOrderRepository
{
    private readonly OrderDbContext _context;

    public OrderRepository(OrderDbContext context) => _context = context;

    public async Task<Order> GetByIdAsync(int id, CancellationToken ct)
    {
        return await _context.Orders
            .Include(o => o.Items)
            .FirstOrDefaultAsync(o => o.Id == id, ct)
            ?? throw new KeyNotFoundException($"Order {id} not found");
    }

    public async Task AddAsync(Order order, CancellationToken ct)
    {
        await _context.Orders.AddAsync(order, ct);
    }

    public async Task SaveChangesAsync(CancellationToken ct)
    {
        await _context.SaveChangesAsync(ct);
    }
}

Next Steps

Continue to API Layer