2009-07-27 5 views
1

私は、更新操作を行うためにSQL SPを使用する動的なdataWebsiteを持っています。私はここで問題があります。私の削除機能も更新(設定IsDeleted = 1)操作です。現在LINQクエリを使用しており、削除のためにdatacontext.SubmitChanges()を呼び出しています。問題は、私がSubmitChanges()を呼び出すときに更新LINQクエリ(IsDeleted = 1に設定)が更新操作のみを対象とする更新SPを呼び出していることです。更新SPを呼び出す代わりに、LINQクエリを直接DBに送信するオプションはありますか?ダイナミックデータWebサイトのLINQヘルプ

Employee ild = (from emp in _dataContext.Employee 
            where emp.IN_ID == int.Parse(ID) 
            select emp).FirstOrDefault(); 
ild.IsDeleted=1; 
_dataContext.Submitchanges(); 

上記のコードでは、Update操作を行うように構成されたUpdateSPが常に呼び出されます。

+0

私たちがあなたを助けるためにあなたのコードを投稿することができます> – StevenMcD

+0

ソフト削除は、彼らが与えているよりもはるかに難しいデザインです:http://weblogs.asp.net/fbouma/archive/2009/02 /19/soft-deletes-are-bad-m-kay.aspx –

答えて

0

私はここでそのアイデアに従うことを100%確信していません。

_dataContext.Employee.remove(ild); 
_dataContext.Submitchanges(); 

をしかし、あなただけで削除されたレコードのように設定IsDeleted = 1を持つ任意のEnployeeを読むためにレコードを更新したかったように思える:

一般的にあなたが言うレコードを削除します。あなたが現在持っているコードを実行すると、UPDATE文が生成されているので、UpdateSPが起動します。

.remove()メソッドを使用できず、物理的にエントリを削除する理由はありますか?

+0

物理的に行を削除しないようにするビジネス要件でした –

+0

ああ、その場合は私の答えは無用です。それについて申し訳ありません! – StevenMcD

1

この場合、update procと同じように呼び出されるdelete stored procを使用できますか?削除procが実際にはテーブルのクエリからDELETEを実行する必要はありませんが、代わりに適宜IsDeletedフラグを設定する基礎となる表の更新を行うことができます:

CREATE PROCEDURE 
    @Id int 
AS 
    UPDATE dbo.Employee 
    SET IsDeleted = 1 
    WHERE Id = @Id 

あなたはその後、削除動作にこの機能をマップしますUpdateメソッドを実行したのと同じように、LINQ to SQLで。このオプションを使用すると、クライアントコードではなくIsDeletedフラグを扱うよりも、テーブルの上に簡単な削除を行うだろう:

_dataContext.Employee.Remove(ild); 
_dataContext.SubmitChanges(); 

をお使いのモデルでは、私はあなたがすべてでIsDeletedを公開するべきではないと主張するだろう。それはデータベース実装の詳細です。ソフト削除を使用する場合は、物理テーブルを抽象化して、ビューまたはテーブル値関数を通じてその機能を公開する必要があります。

ソフト削除オプションの代わりに、トランザクションテーブルを模倣したトゥームストーンテーブルを含めることもできます。削除操作では、ストアドプロシージャまたはトリガを使用してレコードをトランザクションテーブルから廃棄テーブルに移動します。これにより、データベースからIsDeletedフラグを削除し、すべてのアクセス(レポートを含む)にフィルタリングを含める必要がなくなります。

+0

これはまた私が問題を見る方法です。 isDeleted列を更新して移動してください。 –

関連する問題