2009-05-07 6 views
2

Je viens du monde asp.net où nous utiliserions une objectdatasource, accrochée à la couche d'accès aux données, et lui attribuerions la propriété ConflictDetection à "CompareAllValues". Il existe un OldValuesParameterFormatString sur ObjectDataSource que vous utilisez pour identifier les anciens paramètres de valeur.Concurrence avec Linq To Sql Procédures stockées

La procédure sql qui effectue une mise à jour nécessiterait à la fois de nouveaux params et des anciens params et c'était ... Super simple à implémenter; l'ODS a traité les anciennes valeurs pour vous. J'ai passé à Linq to SQL et WinForms. J'ai créé un service WCF qui est notre couche de gestion et j'ai une procédure stockée qui mettra à jour certaines tables. Dans le concepteur de contexte de données, je vois qu'il y a une propriété Update Check sur mes colonnes de classe. Je ne mets pas directement à jour la table de la classe, j'appelle plutôt une procédure stockée pour faire la mise à jour. Existe-t-il un moyen de conserver les valeurs d'origine, peut-être à partir du contexte de données, de la même manière qu'une objectdatasource le ferait?

+0

Certains exemples de code seraient agréables; Comment appelez-vous la procédure stockée? – Andomar

+0

J'ai une référence de service ... C'est donc un appel simple: ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(); then client.UpdateSomeTable(); De toute évidence, les paramètres seraient à la fois de nouvelles valeurs et de vieilles valeurs. Avec une source de données d'objet, ce branchement était facile. –

Répondre

3

Utilisez-vous des procédures stockées directement (via un SqlCommand) ou via LINQ to SQL? LINQ to SQL prend en charge l'utilisation des procédures stockées pour tous ses accès à la base de données. Vous voudrez peut-être regarder Updating our Database using Stored Procedures, partie 7 de la série de blog sur Scott Guthrie à propos de LINQ to SQL. Vous pouvez configurer l'utilisation de sprocs via le concepteur DBML ou dans le code en utilisant une classe partielle DataContext. L'idée est que vous envoyez les valeurs nouvelles et originales (par exemple, Name et OriginalName) au sproc afin qu'il puisse effectuer sa vérification de simultanéité.

Si vous utilisez le sproc directement et non par LINQ to SQL, et tout ce que vous voulez est d'obtenir des valeurs d'origine de l'objet, vous pouvez les obtenir en utilisant Table<T>.GetOriginalEntityState() comme ceci:

Order modifiedOrder = db.Orders.First(); // using first Order as example 
modifiedOrder.Name = "new name";   // modifying the Order 
Order originalOrder = db.Orders.GetOriginalEntityState(modifiedOrder); 
1

Pas la réponse que vous cherchez peut-être, mais comme vous l'avez mentionné en utilisant WCF comme une couche d'affaires avec LINQ2SQL, je l'ai senti est de mon devoir de signaler cet article pour votre référence:

http://www.sidarok.com/web/blog/content/2008/05/26/linq-to-sql-with-wcf-in-a-multi-tiered-action-part-1.html

Bien que l'article implémente ASP.NET en tant que couche de présentation principale, mais compte tenu de votre arrière-plan, il peut en fait rendre l'article plus facile à comprendre.

J'ai personnellement géré le même type de développement que vous faites actuellement (winforms pour le client, WCF pour la couche logique métier, LINQ2SQL pour l'accès aux données), mais étant complètement débutant à WCF & LINQ2SQL à la fois, j'ai fondamentalement forcé pour supprimer la rétention des valeurs d'origine. Cet article est le plus proche de vos besoins, mais pour être honnête, je n'ai rien vu qui fonctionne avec l'utilisation de procédures stockées.

-1
  • Ditch les sprocs et créez un nouveau fichier DBML pour vos tables.
  • Faites glisser vos tables et bam! LinqToSql créera pour vous des classes d'entités avec des méthodes de mise à jour (création .. etc).

LinqToSql dispose d'un certain nombre d'approches pour la simultanéité. L'une des méthodes surchargées Attach() (utilisée pour les mises à jour) nécessite 2 paramètres: l'entité d'origine et la nouvelle entité. LinqToSql va faire ce que le ObjectDataSource faisait et comparer les anciennes valeurs avec les nouvelles exceptions de concurrence et de lancer (cela rend même la gestion des exceptions de concurrence beaucoup plus facile. +10 ..mais ce n'est pas votre question).

Use this reference, en particulier la section vers le bas appelé avec les entités complètes. Cela a beaucoup de sens et montre comment les différentes approches de concurrence sont utilisées et comment gérer les exceptions.

de s'amuser.

+0

Il est implicite que les sprocs sont requis et ne peuvent pas être "abandonnés". – Lucas

Questions connexes