2010-05-20 2 views
1

Dans LINQ to SQL, je veux éviter de mettre des colonnes si les autres n'ont pas changé? Dire que j'aiComment puis-je éviter de définir certaines colonnes si les autres n'ont pas changé, en travaillant avec Linq To SQL?

dim row = (From c in dataContext.Customers Where c.Id = 1234 Select c).Single() 
row.Name = "Example" 
' line 3 
dataContext.SubmitChanges() ' line 4 

Super, LINQ to SQL va chercher une rangée, définit le nom de « Exemple » dans la mémoire, et génère une mise à jour SQL requête seulement si nécessaire --Que est, pas SQL sera généré si le nom du client était déjà "Exemple". Donc supposons sur la ligne 3, je veux détecter si la ligne a changé, et si c'est le cas, définissez row.UpdateDate = DateTime.Now. Si la ligne n'a pas changé, je ne veux pas définir row.UpdateDate de sorte qu'aucun SQL ne soit généré. Y a-t-il un bon moyen de le faire?

+0

Ceci est un côté laid de l'abstraction OR. Y a-t-il un moyen d'éviter de se préoccuper de cela? c'est-à-dire, en quelque sorte pour mettre en place la carte OU pour mettre à jour automatiquement row.UpdateDate chaque fois qu'une autre colonne a changé? –

Répondre

1

Vous pourriez implémenter quelque chose comme ceci, car je ne suis pas sûr s'il y a un moyen par défaut d'accomplir cela puisque vous définissez la propriété.

Dim row = (From c in dataContext.Customers Where c.id = 1234 Select c).Single 
if (row.Name <> "Example") Then 
    row.Name = "Example" 
    row.UpdateDate = DateTime.Now 
End If 
datacontext.SubmitChanges() 

EDIT

Il y a un événement PropertyChanged à l'intérieur de la classe DataContext que vous pouvez accrocher dans.

Alors vous pourriez faire quelque chose comme

AddHandler row.PropertyChanged, AddressOf UpdateRowDate

+0

C'est ce dont j'avais peur. Vous pouvez imaginer s'il y a dix colonnes à définir, alors je dois gérer dix prédicats dans mon conditionnel. J'espère juste un moyen de dire [Si row.HasChanged() Then row.UpdateDate = DateTime.Now] Je pourrais écrire ma propre méthode si je savais comment détecter si la ligne a changé en mémoire. –

+0

fait une modification après avoir regardé une classe datacontext générée – msarchet

+0

Vous pouvez utiliser PropertyChanged, mais il est également lourd. –

0

Je ne peux pas penser le code réel du haut de ma tête, mais étant donné que les entités LINQ to SQL sont les classes partielles étendent juste une certaine logique pour les vérifier. Chaque propriété a des événements sur quand ils sont modifiés, donc dans votre classe partielle se lient à l'événement changé de propriété et l'ont mis le UpdateDate sur l'objet.