3

1つのフィールドを除いて「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<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();

    }

テーブルデータ

ここに画像の説明を入力してください

読む:

  1. LINQ to SQL:エンティティ全体を取得せずに唯一のフィールドを更新する方法

  2. LINQ 2 SQLで最初にデータを選択せず​​に更新しますか?

  3. LINQのSELECTをSQLに更新

  4. linqtosqlは複数の行を更新します

  5. (C#変数の)デフォルト値LINQ toSQLUpdateでの問題


4

1 に答える 1

2

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

    }
于 2012-06-26T05:08:19.190 に答える