LINQ to SQL:“UpdateCheck = Never”时不刷新更新

我有一个帐户实体,除了一个字段外,其中包含“UpdateCheck = Never”中的所有字段。 “ModifiedTime”字段使用“UpdateCheck = Always”。 目的是 – 并发检查应仅基于“ModifiedTime”列。

出于测试目的,我提供了用C#代码硬编码的“ModifiedTime”值。 因此,无需从数据库中获取任何值以实现并发性。 只有当我调用Refresh方法时,代码才会更新数据库。 这看起来很奇怪。 有什么方法可以避免这个吗

请参阅http://msdn.microsoft.com/en-us/library/bb386929.aspx中的 “不使用查询进行更新”部分

注意:我试图通过不使用Refresh来避免SELECT语句

生成的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 -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1 

更新查询

 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 

表结构

 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#代码

  public virtual void UpdateChangesByAttach(T entity) { if (Context.GetTable().GetOriginalEntityState(entity) == null) { //If it is not already attached Context.GetTable().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(); } 

表数据

在此处输入图像描述

读:

  1. LINQ to SQL:如何在不检索整个实体的情况下更新唯一字段

  2. 在没有先在LINQ 2 SQL中选择数据的情况下更新?

  3. LINQ to SQL中的UPDATE SELECT

  4. linq to sql update mulitple rows

  5. 缺省值(C#变量)LINQ to SQL Update中的问题


感谢@sgmoore。 要更新的值在Attach方法之后设置。 现在它正在运作。 还有什么需要改进吗?

生成的SQL

 UPDATE [dbo].[Account] SET [AccountType] = @p2, [Duration] = @p3, [ModifiedTime] = @p4 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) [NEXT] -- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [4] -- @p4: Input DateTime (Size = -1; Prec = 0; Scale = 0) [6/26/2012 10:29:19 AM] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1 

  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; //Primary Key accEntity.ModifiedTime = previousDateTime; //Concurrency column accountRepository.UpdateChangesByAttach(accEntity); //Values to be modified after Attach accEntity.AccountType = "NEXT"; accEntity.ModifiedTime = DateTime.Now; accEntity.Duration = 4; accountRepository.SubmitChanges(); } public virtual void UpdateChangesByAttach(T entity) { if (Context.GetTable().GetOriginalEntityState(entity) == null) { //If it is not already attached Context.GetTable().Attach(entity); } }