1

これは、私がやりたいことの非常に基本的な例です。私が思いついたコードは非常に冗長なようです...つまり、コレクションをループするなど.

削除、挿入、更新された ViewModel のコレクションをポストバックする Telerik MVC グリッドを使用しています。ビュー モデルは似ていますが、エンティティとまったく同じではありません。

たとえば...私は持っています:

Order.Lines. Lines は、OrderDetail レコードを含むエンティティ コレクション (ナビゲーション プロパティ) です。を使用したコントローラーの更新アクションで、POST データから取得されたリスト名 DeletedLines があります。また、データベースにクエリを実行し、Lines コレクションを含む Order エンティティを取得しました。

ここで、基本的に、Lines EntityCollection 内のすべての OrderDetails を削除するように指示したいと思います。

私がやった方法は次のようなものです:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.Where(l => l.Key == line.Key).SingleOrDefault())
}

.Interset() を使用して削除するエンティティのコレクションを取得し、それを DeleteObject.. に渡す方法があることを望んでいましたが、DeleteObject はコレクションではなく単一のエンティティのみを受け入れるようです。

おそらく上記で十分ですが、もっと簡単な方法があるはずです。

ありがとう、BOb

4

2 に答える 2

2

DeletedLines の項目はコンテキストに関連付けられていますか? もしそうなら、これはどうですか?

foreach (var line in DeletedLines) db.DeleteObject(line);

コメント #1 への応答

わかりました。コードを少し短くすることはできますが、それほど長くはありません。

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.SingleOrDefault(l => l.Key == line.Key))
}

nullを渡したときにDeleteObjectが例外をスローするかどうかはわかりません。その場合は、アイテムがそこにあることが確実である限り、Single を使用する方が良い場合があります。

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.Single(l => l.Key == line.Key))
}
于 2012-01-13T20:39:38.690 に答える
0

データベースを再クエリしたくなく、マッピング テーブルの PK 値が既にある (またはクライアント呼び出しに含めることができる) 場合は、最初に取得せずに削除するための Alex James のヒントの 1 つを使用できます。

http://blogs.msdn.com/b/alexj/archive/2009/03/27/tip-9-deleting-an-object-without-retrifying-it.aspx

于 2012-01-14T09:29:39.893 に答える