我有在各个领域的“UpdateCheck的=从不”,除了一个外地账户的实体。 该“ModifiedTime”字段使用“UpdateCheck的=始终”。 其目的是 - 并发检查应根据“ModifiedTime”仅列。
对于测试的目的,我提供的C#代码硬编码的“ModifiedTime”值。 因此,有没有需要从数据库读取的任何值并发。 不过该代码将更新只有当我呼吁刷新方法的数据库。 这似乎很奇怪。 任何方法来避免这种情况?
请参阅:“没有更新查询”一节http://msdn.microsoft.com/en-us/library/bb386929.aspx
注:我试图通过不使用刷新避免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<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();
}
数据表
读:
的LINQ to SQL:如何更新的唯一领域而不检索整个实体
更新没有LINQ 2 SQL第一选择数据?
更新选择在LINQ to SQL
LINQ to SQL的更新多张行
默认值的问题(C#的变量)在LINQ to SQL更新