Как правильно выполнять привязку 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, но в моём приложении это пока не нужно.
Может нужно делать класс-обёртку, в котором уже реализуются расчётные свойства, который наследуется или содержит ссылку на объект?