2009-10-17 70 views
0

我有一個LINQ到SQL實體,其發射以下兩個SQL語句:如何指示linq to sql在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 

但我需要實體發出的sql語句如以下所列,其中LastUpdatedOn和LastUpdatedBy被設置爲默認值。我想我必須實現「部分無效更新...」的擴展性方法定義,但不知道如何繼續。有人可以幫我解決這個問題嗎?

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 

的問候,在SQL Server

回答

2

默認值永遠只適用於如果你INSERT的新紀錄。當您更新現有記錄時,它們從未得到應用。

如果您希望您的LastUpdateOnLastUpdateBy列也針對每次更新進行更新,那麼您可能必須考慮使用觸發器來處理該更新。或者將它們暴露爲實體/實體上的屬性,以便可以在更新語句執行之前以編程方式設置它們。

LINQ到SQL提供了許多擴展點掛鉤到 - 例如在OnValidate方法對實體類:

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

或者你可以實現你的類分法OnUpdate(Entity)並根據需要設置字段:

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

使用審計工具類另一個選擇解釋here

馬克

+0

+1 ...或另一種選擇是覆蓋的SubmitChanges在部分DC類,經過變更集,檢查是否含有實體LastUpdatedBy/LastUpdatedOn,如果是這樣設定。 – KristoferA 2009-10-18 03:17:20

0

我更好地在數據庫級處理我的問題,使用觸發器,因爲我需要這些字段可自動更新,並使用服務器端的信息(日期/時間)。

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