2009-10-17 4 views
0

J'ai un Linq à l'entité SQL qui émette les deux instructions SQL suivantes:Comment indiquer à linq to sql de mettre à jour les colonnes de la table avec leurs valeurs par défaut dans UpdateOnSubmit/SubmitChanges?

UPDATE [identity].[AddressTypes] 
SET [Name] = @p4 
WHERE ([SurrogateKey] = @p0) AND ([Name] = @p1) AND ([LastUpdatedOn] = @p2) AND ([LastUpdatedBy] = @p3) 
-- @p0: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) [b0cf44d9-c6ba-de11-b194-001e37f334ea] 
-- @p1: Input VarChar (Size = 11; Prec = 0; Scale = 0) [Residencial] 
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [16/10/2009 23:43:28] 
-- @p3: Input NVarChar (Size = 23; Prec = 0; Scale = 0) [LUCIANO-NOTEBOO\Luciano] 
-- @p4: Input VarChar (Size = 4; Prec = 0; Scale = 0) [Home] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

UPDATE [identity].[AddressTypes] 
SET [Name] = @p4 
WHERE ([SurrogateKey] = @p0) AND ([Name] = @p1) AND ([LastUpdatedOn] = @p2) AND ([LastUpdatedBy] = @p3) 
-- @p0: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) [b1cf44d9-c6ba-de11-b194-001e37f334ea] 
-- @p1: Input VarChar (Size = 9; Prec = 0; Scale = 0) [Comercial] 
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [16/10/2009 23:43:29] 
-- @p3: Input NVarChar (Size = 23; Prec = 0; Scale = 0) [LUCIANO-NOTEBOO\Luciano] 
-- @p4: Input VarChar (Size = 8; Prec = 0; Scale = 0) [Business] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

Mais je dois l'entité pour émettre les instructions SQL comme celles ci-dessous, où LastUpdatedOn et LastUpdatedBy sont à leurs valeurs par défaut. Je suppose que je vais devoir implémenter la définition de la méthode d'extensibilité pour "mise à jour partielle void ...", mais je ne sais pas comment procéder. N'importe qui pourrait m'aider à résoudre ça?

UPDATE [identity].[AddressTypes] 
SET [Name] = @p4, [LastUpdatedOn] = DEFAULT, [LastUpdatedBy] = DEFAULT 
WHERE ([SurrogateKey] = @p0) AND ([Name] = @p1) AND ([LastUpdatedOn] = @p2) AND ([LastUpdatedBy] = @p3) 
-- @p0: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) [b0cf44d9-c6ba-de11-b194-001e37f334ea] 
-- @p1: Input VarChar (Size = 11; Prec = 0; Scale = 0) [Residencial] 
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [16/10/2009 23:43:28] 
-- @p3: Input NVarChar (Size = 23; Prec = 0; Scale = 0) [LUCIANO-NOTEBOO\Luciano] 
-- @p4: Input VarChar (Size = 4; Prec = 0; Scale = 0) [Home] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

UPDATE [identity].[AddressTypes] 
SET [Name] = @p4, [LastUpdatedOn] = DEFAULT, [LastUpdatedBy] = DEFAULT 
WHERE ([SurrogateKey] = @p0) AND ([Name] = @p1) AND ([LastUpdatedOn] = @p2) AND ([LastUpdatedBy] = @p3) 
-- @p0: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) [b1cf44d9-c6ba-de11-b194-001e37f334ea] 
-- @p1: Input VarChar (Size = 9; Prec = 0; Scale = 0) [Comercial] 
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [16/10/2009 23:43:29] 
-- @p3: Input NVarChar (Size = 23; Prec = 0; Scale = 0) [LUCIANO-NOTEBOO\Luciano] 
-- @p4: Input VarChar (Size = 8; Prec = 0; Scale = 0) [Business] 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

Cordialement,

Répondre

2

valeurs par défaut dans SQL Server ne sont jamais appliqués lorsque vous INSERT un nouveau record. Ils ne sont jamais appliqués lorsque vous mettez à jour un enregistrement existant.

Si vous souhaitez que vos colonnes LastUpdateOn et LastUpdateBy soient également mises à jour pour chaque mise à jour, vous devrez probablement utiliser des déclencheurs pour gérer cela. Ou exposez-les en tant que propriétés sur votre entité/entité afin de pouvoir les définir par programme avant que l'instruction de mise à jour ne soit exécutée. Linq-to-SQL vous donne un certain nombre de points d'extension à accrocher dans, par exemple, 0 à la méthode OnValidate de votre classe d'entité:

partial void OnValidate(System.Data.Linq.ChangeAction action) 
{ 
    if (action == ChangeAction.Update) 
    { 
     // set your LastUpdatedBy and LastUpdatedOn values here 
    } 
} 

Ou vous pourriez mettre en œuvre la méthode partielle OnUpdate(Entity) dans votre classe et définissez les champs selon vos besoins:

partial void UpdateEmployee(Employee instance) 
{ 
    // set your LastUpdatedBy and LastUpdatedOn values here 
    ExecuteDynamicUpdate(instance); 
} 

Une autre option à l'aide d'une classe utilitaire pour la vérification est expliquée here.

Marc

+0

+1 ... ou encore une autre option est de passer outre SubmitChanges dans une classe CC partielle, passer par le jeu de changement, vérifier si les entités contiennent LastUpdatedBy/LastUpdatedOn, et le cas échéant les définir. – KristoferA

0

Je ferais mieux géré mon problème au niveau de la base de données, en utilisant des déclencheurs, puisque je avais besoin de ces champs pour être mis à jour automatiquement et en utilisant les informations côté serveur (date/heure).

CREATE TRIGGER [identity].[AddressTypesInsteadOfUpdate] 
    ON [identity].[AddressTypes] 
    INSTEAD OF UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    UPDATE [identity].AddressTypes 
    SET Name = inserted.Name, 
     LastUpdatedOn = DEFAULT, 
     LastUpdatedBy = DEFAULT 
    FROM [identity].AddressTypes 
     INNER JOIN 
     inserted 
     ON [identity].AddressTypes.SurrogateKey = inserted.SurrogateKey 
END 
Questions connexes