как обеспечить уведомление о состоянии редактирования (IsEdited или чего-либо другого) объекта EFCore - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть класс Invoice, в котором есть InvoiceRows.

public class Invoice
{
    [Key]
    public int? Id { get; set; }

    public DateTime InvoiceDate {
        get => invoiceDate;
        set => PropertySet<DateTime>(value, ref invoiceDate);
    }
    private DateTime invoiceDate;

    public List<InvoiceRow> Rows { get; } = new List<InvoiceRow>();

    [NotMapped]
    public bool IsEdited { get; set; } = false;

    public void PropertySet<T>(T value, ref T field)
    {
        if (value.Equals(field)) return;
        field = value;
        IsEdited = true;
    }

}

Счет-фактура редактируется в графическом интерфейсе WPF, который требует уведомлений о редактировании счета-фактуры, например, для активации кнопки сохранения.
(В первой реализации я думал, что IsEdited был предметом модели представления, и я исключил его из модели и вместо этого включил в модель представления. Оказывается довольно сложным при обработке подзаписей. Однако я еще не до конца осознал, какой вариант лучше использовать модель или реализацию модели представления, и это, возможно, второй вопрос.)

IsEdited легко управляется на уровне записей, но как с ним обращаться на уровне InvoiceRow?
Первая идея, которая приходит в голову, - это уведомить об этом главную record.
Это, в свою очередь, требует дополнительного кода для подключения уведомлений между Invoice и Rows.

Другая идея состоит в том, чтобы использовать состояние DbContext, которое хранит в одном месте требуемую информацию, а не собирать ее вокруг вложенных записей.

Остались ли другие варианты? Одна из проблем такого решения - полностью оценить последствия каждого подхода заранее. Каковы плюсы / минусы разных способов справиться с этим? В своем небольшом опыте работы с WPF я читал кое-что о наемных архивных моделях представления. Может быть, они подходят для этого, обрабатывая подведение итогов на уровне модели представления?

...