Исходный код вики Сценарии и проблемы

Редактировал(а) Alexandr Fokin 2024/04/16 10:47

Последние авторы
1 ----
2
3 ==== Внутренние ссылки: ====
4
5 ====== Дочерние страницы: ======
6
7 {{children/}}
8
9 ====== Обратные ссылки: ======
10
11 {{velocity}}
12 #set ($links = $doc.getBacklinks())
13 #if ($links.size() > 0)
14 #foreach ($docname in $links)
15 #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument())
16 * [[$escapetool.xml($rdoc.fullName)]]
17 #end
18 #else
19 No back links for this page!
20 #end
21 {{/velocity}}
22
23 ----
24
25
26 |(% style="width:303px" %)Табличные указания (Хинты), явные блокировки.|(% style="width:1190px" %)(((
27 Варианты на основе механизма [[Interception EF | Перехватчики>>doc:Разработка.NET.Работа с БД.EntityFramework | EntityFrameworkCore.Механизмы.Interception | Перехватчики.WebHome]].
28
29 Entity Framework with NOLOCK
30 [[https:~~/~~/stackoverflow.com/questions/926656/entity-framework-with-nolock>>https://stackoverflow.com/questions/926656/entity-framework-with-nolock]]
31
32 How to implement Select For Update in EF Core
33 [[https:~~/~~/stackoverflow.com/questions/37984312/how-to-implement-select-for-update-in-ef-core>>https://stackoverflow.com/questions/37984312/how-to-implement-select-for-update-in-ef-core]]
34 )))
35 |(% style="width:303px" %)Использование конструктора типа|(% style="width:1190px" %)1) По умолчанию фреймворк будет использовать конструктор без параметров, чтобы фреймворк попытался выбрать подходящий конструктор, конструктора без параметров быть не должно. (При этом достаточно создать конструктор с необязательным параметром)
36 2) В качестве параметров конструктора нельзя передавать навигационные свойства, а также комплексные/вложенные свойства.
37 |(% style="width:303px" %)Изменение сущности без загрузки из БД.|(% style="width:1190px" %)(((
38 |=(% style="width: 206px;" %)(% id="cke_bm_647S" style="display:none" %) (%%)Тип|=(% style="width: 546px;" %)Описание|=(% style="width: 770px;" %)Материалы
39 |(% style="width:206px" %)Обычное свойство.
40 Навигационное свойство.|(% style="width:546px" %)(((
41 Достаточно просто выполнить Attach объекта.
42
43 Могут возникнуть проблемы при попытке присвоить свойству значение по умолчанию.
44
45 {{code language="none"}}
46 item.NavigationId = null;
47 //Явно помечаем свойство, как измененное.
48 entry.Property(e => e.NavigationId).IsModified = true;
49 {{/code}}
50 )))|(% style="width:770px" %)(((
51 how to update entity without first loading it
52 [[https:~~/~~/stackoverflow.com/questions/56722199/how-to-update-entity-without-first-loading-it>>https://stackoverflow.com/questions/56722199/how-to-update-entity-without-first-loading-it]]
53
54 Update doesn't set foreign key to null when changed outside of context #6244
55 [[https:~~/~~/github.com/dotnet/efcore/issues/6244>>https://github.com/dotnet/efcore/issues/6244]]
56 )))
57 |(% style="width:206px" %)Навигационное свойство для подчиненного объекта.|(% style="width:546px" %)(((
58
59 )))|(% style="width:770px" %)
60
61 [[Change Tracking | Отслеживание изменений>>Разработка.NET.Работа с БД.EntityFramework | EntityFrameworkCore.Механизмы.Change Tracking | Отслеживание изменений.WebHome]]
62
63 Дополнение: рассматривается сценарий с отслеживанием изменений по умолчанию (с использованием автоматического определения изменений через сравнение, а не IPropertyChanged)
64 )))
65 |(% style="width:303px" %)Про AsNoTracking, Attach и ошибку
66 "The instance of entity type cannot be tracked because another instance with the same key value for {'key'} is already being tracked..."|(% style="width:1190px" %)(((
67 ===== Вводные: =====
68
69 Делаем следующую выборку из 2 таблиц
70 Entity1 -> LinkedEntity1
71 Entity2 -> LinkedEntity1
72 Где Entity1, Entity2 - две строки из таблицы Entity, а LinkedEntity1 - одна строка из связанной таблицы. (Обе сущности Entity[i] ссылаются на одну и ту же строку - LinkedEntity1)
73
74 (% class="wikigeneratedid" id="HChangeTracking7C41E44244143B43543643843243043D43843543843743C43543D43543D438439" %)
75 [[Change Tracking | Отслеживание изменений>>Разработка.NET.Работа с БД.EntityFramework | EntityFrameworkCore.Механизмы.Change Tracking | Отслеживание изменений.WebHome]]
76
77 * Когда включен AsNoTracking
78 ReferenceEquals(Entity1.LinkedEntity, Entity2.LinkedEntity) - false
79 Т.е. фреймворк не только не отслеживает данные, но и не фиксирует повторяющиеся сущности из БД. Итого создано 2 экземпляра LinkedEntity.
80 * Когда выключен AsNoTracking
81 ReferenceEquals(Entity1.LinkedEntity, Entity2.LinkedEntity) - true
82 Фреймворк обнаружил повторяющуюся сущность и создал только 1 экземпляр LinkedEntity.
83
84 ===== Завершение: =====
85
86 В случае, если попытаться прикрепить полученный графы (Entity1 и Entity2) объектов к другому контексту, то можно получить ошибку из-за двух экземпляров LinkedEntity с одинаковым первичным ключом.
87 Поэтому необходимо сделать выборку с включенным трекингом, даже если мы не планируем менять данные в том-же контексте, а планируем присоединить их к другому.
88
89 UDP: в случае, если запрос один можно использовать метод AsNoTrackingWithIdentityResolution
90 )))
91 |(% style="width:303px" %) |(% style="width:1190px" %)Организация поиска в локальном наборе ([[Change Tracking ~~| Отслеживание изменений>>doc:Разработка.NET.Работа с БД.EntityFramework | EntityFrameworkCore.Механизмы.Change Tracking | Отслеживание изменений.WebHome]]) по альтернативным ключам.
92 Отслеживание событий присоединения/отсоединения сущностей и сохранение их в Dictionary с нужным ключом (с учетом уникальности ключа).
93 |(% style="width:303px" %)Несколько индексов над одинаковыми столбцами.|(% style="width:1190px" %)Необходимо явно указать псевдоним, что framework смог их различить.
94 {{code language="c#"}}builder.HasIndex(e => new { e.column1, e.column2 }, "index1")
95 .IsUnique(false);
96
97 builder.HasIndex(e => new { e.column1, e.column2 }, "index2")
98 .HasFilter(@"""column1"" = 1")
99 .IsUnique(true);{{/code}}