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

我有以下代码用于使用LINQ to SQL更新Account表。 AccountNumber是主键列。 需要更新的唯一值是AccountType; 但是,持续时间也会更新为零(int的默认值)。 我们怎样才能避免这种不必要的覆盖呢?

注意:我使用的是Attach方法

注意:我理解这种行为的原因。 “DataContext无法区分分配值为零的字段和仅仅未分配的字段。” 我正在寻找解决方案来解决这个问题。

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Duration", DbType="Int NOT NULL" public int Duration 

表数据

在此处输入图像描述

表结构:

  CREATE TABLE [dbo].[Account]( [AccountNumber] [int] NOT NULL, [AccountType] [nchar](10) NOT NULL, [Duration] [int] NOT NULL, [DepositedAmount] [int] 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] 

  public void UpdateAccount() { RepositoryLayer.Account acc1 = new RepositoryLayer.Account(); acc1.AccountNumber = 4; acc1.AccountType = "Verify"; accountRepository.UpdateChangesByAttachAndRefresh(acc1); accountRepository.SubmitChanges(); } public virtual void UpdateChangesByAttachAndRefresh(T entity) { //Can GetOriginalEntityState cause any bug? Is it unnecessary? if (GetTable().GetOriginalEntityState(entity) == null) { //If it is not already attached Context.GetTable().Attach(entity); Context.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, entity); } } 

生成的SQL

 UPDATE [dbo].[Account] SET [AccountType] = @p3, [Duration] = @p4 WHERE ([AccountNumber] = @p0) AND ([AccountType] = @p1) AND ([Duration] = @p2) AND ([DepositedAmount] IS NULL) -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [4] -- @p1: Input NChar (Size = 10; Prec = 0; Scale = 0) [TEST ] -- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [10] -- @p3: Input NChar (Size = 10; Prec = 0; Scale = 0) [Verify] -- @p4: Input Int (Size = -1; Prec = 0; Scale = 0) [0] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1 

读:

  1. LINQ-to-SQL可以在插入时省略未指定的列,因此使用数据库默认值吗?

  2. 如何将Enum绑定到bit或int的DbType?

  3. Linq to SQL:为什么我收到IDENTITY_INSERT错误?

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

这应该做:

 int number = 4; var acc1 = new accountRepository.Accounts.Where(a => a.Number == number).FirstOrDefault(); if (acc1 == null) { // Not found by ID, create new acc1 = new RepositoryLayer.Account(); acc1.Number = number; accountRepository.Accounts.AddObject(acc1); } acc1.AccountType = "Verify"; accountRepository.SubmitChanges(); 

我通过按照LINQ to SQL中的答案更改更新方法解决了这个问题:当“UpdateCheck = Never”时更新而不刷新

对于“持续时间”列,UpdateCheck设置为“从不”

  public void UpdateAccount() { //Used value from previous select DateTime previousDateTime = new DateTime(2012, 6, 26, 11, 14, 15, 327); int prevDuration = 0; RepositoryLayer.Account accEntity = new RepositoryLayer.Account(); accEntity.AccountNumber = 1; //Primary Key accEntity.ModifiedTime = previousDateTime; //Concurrency column //accEntity.Duration = prevDuration; accountRepository.UpdateChangesByAttach(accEntity); //Values to be modified after Attach accEntity.AccountType = "WIN-WIN"; accEntity.ModifiedTime = DateTime.Now; try { accountRepository.SubmitChanges(); } catch(System.Data.Linq.ChangeConflictException e) { throw new Exception(e.Message); } } public virtual void UpdateChangesByAttach(T entity) { if (Context.GetTable().GetOriginalEntityState(entity) == null) { //If it is not already attached Context.GetTable().Attach(entity); } } 

生成的SQL

 UPDATE [dbo].[Account] SET [AccountType] = @p2, [ModifiedTime] = @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/26/2012 11:14:15 AM] -- @p2: Input NChar (Size = 10; Prec = 0; Scale = 0) [WIN-WIN] -- @p3: Input DateTime (Size = -1; Prec = 0; Scale = 0) [6/26/2012 11:16:29 AM]