Мелкозернистый CRUD с SimpleRepository от Subsonic
Допустим, в моем приложении на C# есть TestClass со свойством A и свойством B. Я изменяю значение B своим кодом, я оставляю свойство A без изменений. Я обновляю TestClass в базе данных методом обновления SimpleRepository.
Как я вижу, он обновляет также свойство A в базе данных.
Это легко проверить: я изменяю значение A в своей базе данных вне моего приложения ("вручную"), затем я делаю обновление из своего приложения. Значение свойства A изменяется обратно на его значение в соответствии с состоянием TestClass в моем приложении.
Итак, мой вопрос: возможно ли создавать обновления только для некоторых свойств, а не для всего класса с помощью SimpleRepository? Есть ли какие-то возможности "IgnoreFields"?
2 ответа
Что вам нужно optimistic concurrency
на ваше UPDATE
утверждение, чтобы не исключать определенные поля. Короче говоря, это означает, что при обновлении таблицы WHERE
пункт приложен к вашему UPDATE
утверждение, которое обеспечивает значения полей в строке на самом деле, что они были, когда последний SELECT
был запущен.
Итак, давайте предположим, что в вашем примере я выбрал некоторые данные и значения для A
а также B
мы 1
а также 2
соответственно. Теперь давайте предположим, что я хотел обновить B
(нижеприведенное утверждение является лишь примером):
UPDATE TestClass SET B = '3' WHERE Id = 1;
Однако вместо выполнения этого оператора (потому что там нет параллелизма), давайте запустим этот:
UPDATE TestClass SET B = '3' WHERE Id = 1 AND A = '1' AND B = '2';
Это утверждение теперь гарантирует, что запись не была изменена никем.
Тем не менее, на данный момент не похоже, что SimpleRepository Subsonic поддерживает какой-либо тип параллелизма, и это будет серьезным недостатком. Если вы ищете очень прямую библиотеку репозитория, в которой вы можете использовать POCO, я бы порекомендовал Dapper. На самом деле, Dapper используется Stackru. Это чрезвычайно быстро и легко позволит вам встроить параллелизм в ваши операторы обновления, потому что вы просто отправляете параметризованные операторы SQL.
- Эта статья Stackru является общей статьей о том, как использовать Dapper для всех операций CRUD.
- В этой статье Stackru показано, как выполнять вставки и обновления с помощью Dapper.
ПРИМЕЧАНИЕ: с Dapper вы также можете делать то, что хотите, потому что отправляете базовые операторы SQL, но я бы просто не рекомендовал не использовать параллелизм.
Не вызывайте метод обновления объекта DataObject для таких случаев, вы в основном указываете, что объект был изменен и должен быть обновлен в БД. Таким образом, дозвуковой будет генерировать запрос как
UPDATE TestClass SET A ='', B='', ModifiedOn = 'DateHere' WHERE PrimaryKey = ID
чтобы изменить только свойство B, вам нужно выполнить запрос UPDATE вручную. взглянуть на Subsonic.Update
учебный класс.
В идеале не следует формировать новый экземпляр объекта данных вручную, если вы делаете это, убедитесь, что значения скопированы из объекта, полученного из Subsonic.Select
запрос.
Поэтому, когда вы обновляете значение даже только одного свойства, все другие свойства будут содержать свое собственное значение из БД, а не значение по умолчанию, в зависимости от типа свойства.