2012-09-12 3 views
0

de Let Subsonic » que j'ai un TestClass dans mon application C# avec la propriété A et la propriété B. Je change la valeur de B par mon code, je laisse la propriété A inchangé. Je mets à jour TestClass dans la base de données par la méthode Update de SimpleRepository.à grains fins CRUD avec SimpleRepository

Comme je le vois met à jour également la propriété Une valeur dans la base de données.

Il est facile à tester: Je change la valeur A dans ma base de données en dehors de mon application («à la main»), puis je fais la mise à jour de mon application. Valeur de la propriété Un retourne à sa valeur en fonction de l'état de TestClass dans mon application.

Donc, ma question: est-il possible de faire des mises à jour seulement pour certaines propriétés, pas pour toute la classe avec SimpleRepository? Y a-t-il des possibilités 'IgnoreFields'?

Répondre

1

Ce dont vous avez besoin est optimistic concurrency sur votre déclaration UPDATE, pour ne pas exclure certains champs. En bref, ce que cela signifie est lors de la mise à jour d'une table, une clause WHERE est ajoutée à votre déclaration UPDATE qui garantit que les valeurs des champs de la ligne sont effectivement ce qu'ils étaient lorsque le dernier SELECT a été exécuté.

Ainsi, supposons que dans votre exemple, je choisis des données et les valeurs de A et B étaient 1 et 2 respectivement. Maintenant, supposons que je voulais mettre à jour B (ci-dessous déclaration est juste un exemple):

UPDATE TestClass SET B = '3' WHERE Id = 1; 

Cependant, au lieu de courir cette déclaration (parce qu'il n'y a pas de concurrence), exécutons celui-ci:

UPDATE TestClass SET B = '3' WHERE Id = 1 AND A = '1' AND B = '2'; 

Cette déclaration garantit désormais que l'enregistrement n'a été modifié par personne.

Cependant, pour l'instant, il ne semble pas que SimpleRepository de Subsonic supporte n'importe quel type de concurrence et que ça va être une chute majeure. Si vous cherchez une bibliothèque de dépôt très simple, où vous pouvez utiliser POCO, je recommanderais Dapper. En fait, Dapper est utilisé par Stackoverflow. C'est extrêmement rapide et vous permettra facilement de construire en concurrence dans vos instructions de mise à jour parce que vous envoyez des instructions SQL paramétrées, simples.

  1. Cet Stackoverflow article est un article général sur l'utilisation de Dapper pour toutes les opérations CRUD.
  2. Ce Stackoverflow article montre comment effectuer des insertions et des mises à jour avec Dapper.

REMARQUE: avec Dapper vous pouvez réellement faire ce que vous êtes désireux aussi bien parce que vous envoyez vers le bas des instructions SQL de base, mais je ne recommanderais pas de ne pas utiliser la concurrence.

1

N'appelez pas la méthode de mise à jour sur le DataObject pour de tels cas, vous indiquez simplement que l'objet a été modifié et doit être mis à jour dans le DB. Donc subsonique va générer une requête comme

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

changer uniquement la propriété B vous devez consturct la requête UPDATE manuellement. Regardez la classe Subsonic.Update.
Idéalement, vous ne devez pas créer une nouvelle instance de l'objet de données manuellement, si vous le faites, assurez-vous que les valeurs sont copiées à partir de l'objet récupéré à partir de la requête Subsonic.Select.
Ainsi, lorsque vous mettez à jour la valeur d'une seule propriété, toutes les autres propriétés conservent leur propre valeur de DB plutôt qu'une valeur par défaut en fonction du type de la propriété.

Questions connexes