Мелкозернистый CRUD с SimpleRepository от Subsonic

Допустим, у меня есть TestClass в моем приложении C# со свойством A и свойством B. Я изменяю значение B своим кодом, оставляю свойство A без изменений. Я обновляю TestClass в базе данных с помощью метода Update SimpleRepository.

Как я вижу, он также обновляет значение свойства A в базе данных.

Это легко проверить: я изменяю значение A в своей базе данных вне моего приложения («вручную»), затем я делаю обновление из своего приложения. Значение свойства A возвращается к его значению в соответствии с состоянием TestClass в моем приложении.

Итак, мой вопрос: возможно ли сделать обновления только для некоторых свойств, а не для всего класса с помощью SimpleRepository? Есть ли какие-то возможности «IgnoreFields»?


person Tom    schedule 12.09.2012    source источник


Ответы (2)


Что вам нужно, так это optimistic concurrency в вашем заявлении UPDATE, чтобы не исключать определенные поля. Короче говоря, это означает, что при обновлении таблицы к оператору UPDATE добавляется предложение WHERE, которое гарантирует, что значения полей в строке на самом деле такие, какими они были при выполнении последнего 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 используется Stackoverflow. Это чрезвычайно быстро и позволяет легко встроить параллелизм в операторы обновления, потому что вы просто отправляете параметризованные операторы SQL.

  1. Эта статья о Stackoverflow представляет собой общую статью о том, как использовать Dapper для всех операций CRUD.
  2. В этой статье Stackoverflow показано, как выполнять вставки и обновления с помощью Dapper.

ПРИМЕЧАНИЕ: с Dapper вы можете делать то, что хотите, потому что вы отправляете базовые операторы SQL, но я бы не рекомендовал не использовать параллелизм.

person Mike Perrenoud    schedule 12.09.2012

Не вызывайте метод обновления для DataObject для таких случаев, вы в основном указываете, что объект был изменен и нуждается в обновлении в БД. Таким образом, дозвуковой будет генерировать запрос, например

UPDATE TestClass SET A ='', B='', ModifiedOn = 'DateHere' WHERE PrimaryKey = ID

чтобы изменить только свойство B, вам нужно создать запрос UPDATE вручную. взгляните на класс Subsonic.Update.
В идеале вам не следует формировать новый экземпляр объекта данных вручную, если вы сделаете это, убедитесь, что значения скопированы из объекта, возвращенного из запроса Subsonic.Select.
Таким образом, когда вы обновляете значение хотя бы одного свойства, все остальные свойства будут содержать собственное значение из БД, а не значение по умолчанию, в зависимости от типа свойства.

person Vignesh.N    schedule 12.09.2012