Исходный код вики Сценарии и проблемы
Редактировал(а) Alexandr Fokin 2024/04/16 10:47
Последние авторы
author | version | line-number | content |
---|---|---|---|
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}} |