|
@@ -86,6 +86,34 @@
|
|
|
.ExecuteSqlRaw($"DELETE FROM Product WHERE Id={currentProduct.Id}");
|
|
.ExecuteSqlRaw($"DELETE FROM Product WHERE Id={currentProduct.Id}");
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
|
|
+1. Достаточно часто видел ситуацию, когда в окне редактирования продукции пытаются привязать данные из словаря, но данных нет.
|
|
|
|
|
+
|
|
|
|
|
+ Это может получиться потому, что на предыдущем окне при получении списка продукции не были получены связанные данные.
|
|
|
|
|
+
|
|
|
|
|
+ **EntityFramework** сам за вас не думает, что вы ему сказали выбрать, то и получите:
|
|
|
|
|
+
|
|
|
|
|
+ ```cs
|
|
|
|
|
+ productList = context.Products
|
|
|
|
|
+ .ToList();
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+ В этом варианте будет выбраны данные только из таблицы **Product**. Чтобы добавить данные в свойство *ProductType* (это виртуальное свойство, что означает, что данные находятся в связанной таблице), нужно добавит метод *Include*
|
|
|
|
|
+
|
|
|
|
|
+ ```cs
|
|
|
|
|
+ productList = context.Products
|
|
|
|
|
+ .Include(p => p.ProductType)
|
|
|
|
|
+ .ToList();
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+ Но злоупотреблять включениями не надо, если связанные данные не нужны на главном окне, то лучше их отдельным запросом подтянуть в окне редактирования. Для этого можно в конструктор окна редактирования передавать не объект целиком, а его `id`:
|
|
|
|
|
+
|
|
|
|
|
+ ```cs
|
|
|
|
|
+ currentProduct = context.Products
|
|
|
|
|
+ .Where(p => p.Id == editProductId)
|
|
|
|
|
+ .Include(p => p.ProductType)
|
|
|
|
|
+ .SingleOrDefault();
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
1. Dapper
|
|
1. Dapper
|
|
|
|
|
|
|
|
Как показал опыт, **EntityFramework** очень громоздкий и не всегда понятный.
|
|
Как показал опыт, **EntityFramework** очень громоздкий и не всегда понятный.
|