Как обновить объект с помощью EFCore, полученного из Mediator - PullRequest
0 голосов
/ 27 марта 2020

Я использую шаблон-посредник (в частности, MediatR ), чтобы получить объект (назовем его и Order), который я хочу обновить с помощью EFCore. Тем не менее, элемент (Order) теряет свое отслеживание, поскольку он не обновляется.

Я хочу сделать это так:

public class MyClass
{
    private readonly MyDbContext dbContext;
    private readonly IMediator mediator;

    public MyClass(MyDbContext dbContext, IMediator mediator) 
    {
        this.dbContext = dbContext;
        this.mediator = mediator;
    }

    protected void UpdateField() 
    {
        var order = await mediator.Send(new GetOrderByIdQuery(OrderId));

        order.PaymentId = newPaymentId;
        dbContext.SaveChanges();
    }
}

Выше не будет работать и Мне нужно сделать что-то вроде

protected void UpdateField() 
{
    var order = dbContext.Orders.SingleOrDefault(o => o.OrderId == OrderId);

    order.PaymentId = newPaymentId;
    dbContext.SaveChanges();
}

, чтобы оно работало и сохранило новое значение так, как я хочу.

В этом случае GetOrderByIdQuery не делает ничего фантастического. Он просто извлекает заказ.

public class GetOrderByIdQueryHandler : IRequestHandler<GetOrderByIdQuery, Order>
{
    private readonly MyDbContext dbContext;

    public GetSubmissionByIdQueryHandler(MyDbContext dbContext)
    {
        this.dbContext = dbContext;
    }

    public async Task<Order> Handle(GetOrderByIdQuery request, CancellationToken cancellationToken)
    {
        return (await dbContext.Orders.FindAsync(request.OrderId));
    }
}

А для полноты приведем класс Order

public class Order
{
    public Guid OrderId { get; private set; }
    public string PaymentId { get; set; }
}
...