I have an Account object that has all the fields in "UpdateCheck = Never" except one field. The field "ModifiedTime" uses "UpdateCheck = Always". The goal - concurrency checking should be based only on the "ModifiedTime" column.
For testing purposes, I supply the value "ModifiedTime", hard-coded in C # code. Therefore, there is no need to retrieve any value from the database for concurrency. However, the code will only update the database if I call the Refresh method. That seems weird. Any approach to avoid this?
Refer to the โUpgrade Without Requestโ section at http://msdn.microsoft.com/en-us/library/bb386929.aspx
Note. I am trying to avoid a SELECT statement without using Refresh
Generated SQL
SELECT [t0].[AccountNumber], [t0].[AccountType], [t0].[Duration], [t0].[DepositedAmount], [t0].[Prefernce], [t0].[Comment], [t0].[ModifiedTime] FROM [dbo].[Account] AS [t0] WHERE [t0].[AccountNumber] = @p0
Refresh Request
UPDATE [dbo].[Account] SET [AccountType] = @p2, [Duration] = @p3 WHERE ([AccountNumber] = @p0) AND ([ModifiedTime] = @p1) -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1] -- @p1: Input DateTime (Size = -1; Prec = 0; Scale = 0) [6/25/2012 5:08:32 PM] -- @p2: Input NChar (Size = 10; Prec = 0; Scale = 0) [SUCESS] -- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [2] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
Table structure
CREATE TABLE [dbo].[Account]( [AccountNumber] [int] NOT NULL, [AccountType] [nchar](10) NOT NULL, [Duration] [int] NOT NULL, [DepositedAmount] [int] NULL, [Prefernce] [int] NULL, [Comment] [nvarchar](50) NULL, [ModifiedTime] [datetime] NOT NULL, CONSTRAINT [PK_Account] PRIMARY KEY CLUSTERED ( [AccountNumber] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
C # code
public virtual void UpdateChangesByAttach(T entity) { if (Context.GetTable<T>().GetOriginalEntityState(entity) == null) { //If it is not already attached Context.GetTable<T>().Attach(entity); Context.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, entity); } } public void UpdateAccount() { //Used value from previous select DateTime previousDateTime = new DateTime(2012, 6, 25, 17, 8, 32, 677); RepositoryLayer.Account accEntity = new RepositoryLayer.Account(); accEntity.AccountNumber = 1; accEntity.AccountType = "SUCESS"; accEntity.ModifiedTime = previousDateTime; accEntity.Duration = 2; accountRepository.UpdateChangesByAttach(accEntity); accountRepository.SubmitChanges(); }
Table data

READING:
LINQ to SQL: how to update a single field without retrieving the entire object
Update without first selecting data in LINQ 2 SQL?
UPDATE SELECT in LINQ to SQL
linq to sql update mulitple rows
Default values โโ(from C # variables) Problem in updating LINQ to SQL