Как правильно выполнять привязку Entity Framework WPF

У меня в проекте есть partial-классы сгенерированных EF poco-классов. В них имеются публичные свойства, которые считают на основании данных некоторые значения : сумму товара в заказе и итог заказа.

На данный момент мои классы выглядят так:

POCO-класс заказа:

    public partial class ORDERS
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public ORDERS()
        {
            this.ORDERS_COMPOSE = new HashSet<ORDERS_COMPOSE>();
            this.SALES = new HashSet<SALES>();
        }
    
        public int ID { get; set; }
        public int USER_ID { get; set; }
        public System.DateTime DATE { get; set; }
        public int CLIENT { get; set; }
        public System.DateTime DELIVERY_DATE { get; set; }
    
        public virtual CLIENTS CLIENTS { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<ORDERS_COMPOSE> ORDERS_COMPOSE { get; set; }
        public virtual USERS USERS { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<SALES> SALES { get; set; }
    }

POCO-класс состава заказа (свойство QUANTITY мне пришлось перенести в partial):

public partial class ORDERS_COMPOSE
{
    public int ID { get; set; }
    public int ORDER_ID { get; set; }
    public int PRODUCT_ID { get; set; }

    public virtual ORDERS ORDERS { get; set; }
    public virtual PRODUCT PRODUCT { get; set; }
}

PARTIAL-класс состава заказа (здесь происходит наследование Notify):

public partial class ORDERS_COMPOSE : Notify
{
    public decimal Sum => QUANTITY * PRODUCT.PRICE;
    private int _quantity;
    public int QUANTITY {
        get => _quantity;
        set { _quantity = value; OnPropertyChanged(nameof(Sum)); ORDERS?.OnPropertyChanged(nameof(ORDERS.Total)); } }
}

PARTIAL-класс заказа (здесь происходит наследование Notify):

public partial class ORDERS : Notify
{
    public decimal Total => ORDERS_COMPOSE.Select(x => x.Sum).Sum();
}

VIEW-model:

   public class VM_Order : Notify
    {
        private KASSAEntities db;
        public VM_Order(ORDERS order = null)
        {
            db = new KASSAEntities();

            if (order != null)
            {
                Order = db.ORDERS.Include(x => x.ORDERS_COMPOSE)
                    .First(x => x.ID == order.ID);

            }
            else
            {
                Order = db.ORDERS.Add(new ORDERS());
            }
            Products = db.ORDERS_COMPOSE.Local.ToBindingList();
        }

        private ORDERS _orders;
        public ORDERS Order { get => _orders; set { _orders = value; OnPropertyChanged(); } }

        public BindingList<ORDERS_COMPOSE> Products { get; set; }

    }

Проблема состоит в том, что по информации в интернете, в POCO-классы лучше никаким образом не лезть и ничего не изменять, а все изменения необходимо обновлять через ViewModel, которая наследует Notify(INotifyPropertyChanged).

С этим кодом всё работает замечательно. Если эта архитектура неправильна, то как правильно оповещать об обновлении свойства?

Я предполагаю, что POCO-классы нельзя редактировать, т.к. они могут поставляться в приложение через dll-библиотеку. Тогда изменение структуры (в моём случае удаление поля quantity и перемещение в partial-класса ORDER_COMPOSE) будет невозможно. Плюc, скорее всего, сейчас архитектуры приложений предрасположены на использование WEB-API, но в моём приложении это пока не нужно.

Может нужно делать класс-обёртку, в котором уже реализуются расчётные свойства, который наследуется или содержит ссылку на объект?


Ответы (0 шт):