Исходный код вики Сценарии и проблемы
Редактировал(а) 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}} |