- - PR -
DB削除フラグのLINQでの実装方法
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-10-09 02:07
レコード削除に関して、物理的にレコードを削除するのではなく削除フラグフィールドが TRUE の時に削除とみなす、論理削除を LINQ を利用して実装したいのですがやり方がわかりません。
System.Data.Linq.ChangeSet の Deletes(クライアントで削除操作されたレコードエンティティ) の各エンティティに対し、 System.Data.Linq.DataContext の SubmitChanges() の前に削除フラグを立て、Deletes.Clear() としてみたのですが、Clear() のコールで NotSupportedException が発生してしまいました。 コードは以下のような感じです。 if (changeSet.Deletes.Count > 0) { foreach (var entity in changeSet.Deletes) { SetDeleteFlag(entity); // この中で削除フラグを立てる } changeSet.Deletes.Clear(); // ここで NotSupportedException が発生 } DataContext.SubmitChanges(); 削除フラグを利用した論理削除は多くのデベロッパーが使っていると思いますが、これを LINQ で使用するには皆さんどのようにされているのでしょうか? [ メッセージ編集済み 編集者: Shin 編集日時 2008-10-09 02:09 ] |
|
投稿日時: 2008-10-09 02:32
自己レスです。
ストアドでオーバーライドする方法があるみたいですね。 http://msdn.microsoft.com/ja-jp/library/bb546186.aspx できればストアドを使わない方法があればと思うのですが、他に方法があればどなたか教えてください。 |
|
投稿日時: 2008-10-09 07:34
とりあえずストアドを作ってうまく行っています。
しかし論理削除に絡んでもう一つ問題が発生しています。 例えば、Order テーブルと親子関係になる OrderDetail テーブルがあるとします。Linq To SQL を使って以下のように1レコードを取得します。 var order = (from n in dataContext.Orders where n.OrderID == 1 select n).First(); そうすると、order.OrderDetails に自動にリレーション先の OrderDetail テーブルのレコードを取得してくれますが、ここに削除フラグの立ったレコードも入ってきてしまいます。 リレーション先の削除フラグの立ったレコードを弾くにはどのような方法が考えられるでしょうか? |
|
投稿日時: 2008-10-09 09:33
OrderDetail側でSelect時に削除フラグがたっているデータを返さないようにする、とかかなぁ。
|
|
投稿日時: 2008-10-10 01:40
コメントありがとうございます。
> OrderDetail側でSelect時に削除フラグがたっているデータを返さないようにする、とかかなぁ。 その方法を考えているのですが、どのような方法が考えられますか? [ メッセージ編集済み 編集者: Shin 編集日時 2008-10-10 01:41 ] |
|
投稿日時: 2008-10-10 09:54
ストアドを組み込む、ではだめなんでしょうか。
できそうな気はするけど。 |
|
投稿日時: 2008-10-11 01:57
Insert/Update/Delete の振る舞いをストアドでオーバーライドできるようなのですが、Select にはできなさそうなんです。
Viewを使うとかかな・・・。あまりやりたくないけど・・・。 |
|
投稿日時: 2008-10-11 15:40
僕は試してないんだけれど、以前 ScottGu のブログで取り上げられていた Dynamic LINQ は使えない?
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx _________________ かるあ のメモ と スニペット |