Обновить сущность дополнительным предложением - PullRequest
2 голосов
/ 29 апреля 2019

В настоящее время я работаю над многопользовательским приложением на основе столбцов. Я добавил tenantId для каждого объекта с базовым классом и использовал фильтры запросов, которые идеально соответствуют моим потребностям. Я также переопределил метод savechanges, чтобы заполнить свойство tenantid для добавленных объектов с помощью средства отслеживания изменений.

Но теперь я застрял с обновлением и удалением. Насколько я знаю, ef генерирует предложение where только с первичным ключом, что для меня очень небезопасно, потому что я работаю в среде API с большим количеством объектов присоединения / отсоединения и вместо этого написал множество entity.state = updated сначала запросить, чтобы улучшить производительность.

Мой вопрос: как добавить предикат в оператор обновления / удаления ядра ef?

Я знаю, что могу: 1. Сначала запрос (и я уверен, что вы мне это порекомендуете) 2. Создайте tenantid как часть составного ключа, но на самом деле было бы трудно реорганизовать весь мой код как add / find / etc. Методы требуют полных первичных ключей.

Буду очень признателен всем, кто знает, как это вызвать!

1 Ответ

2 голосов
/ 30 апреля 2019

Вариант 3:

Несмотря на то, что он не предназначен для этого, вы можете использовать EF Core Оптимистический контроль параллелизма для выполнения этих проверок безопасности:

Вкл.реляционные базы данных EF Core включает проверку значения токена параллелизма в предложении WHERE любых операторов UPDATE или DELETE.После выполнения операторов EF Core считывает количество затронутых строк.Если ни одна строка не затронута, обнаружен конфликт параллелизма, и EF Core выдает DbUpdateConcurrencyException.

Идея состоит в том, чтобы (1) пометить TenantId как токен параллелизма любым атрибутом [ConcurrencyCheck]или IsConcurrencyToken() свободный API и (2) внутри переопределения SaveChanges установите значение свойства TenantId с текущим арендатором Id не только для добавленных, но и для измененных и удаленных объектов.

Таким образом, EF Core добавит что-то вроде AND TenantId == @currentTenantId к UPDATE и DELETE командам, которые будут успешными, только если текущий арендатор совпадает с тем, который использовался для создания сущности.

Недостатком является тип исключения / сообщение и смешивание с существующими проверками параллелизма, если они используются.

Обновление: Код для измененных и удаленных объектов внутри SaveChangesследует установить OriginalValue записи свойства TenantId и сбросить флаг IsModified:

var tenantIdEntry = entityEntry.Property("TenantId");
tenantIdEntry.OriginalValue = CurrentTenantId;
tenantIdEntry.IsModified = false;

Последнее не требуется, если свойство TenantId сконфигурировано с AfterSaveBehavior = PropertySaveBehavior.Ignore, как описано в Как лучше всего выполнять частичные обновления в ядре EF и никогда не обновлять определенные свойства? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...