39

この質問に対する答えをどこかで見たことがあると確信していますが、SOまたはGoogleで数回検索しても見つからなかったので、とにかくもう一度尋ねます...

Entity Framework では、データ オブジェクトを削除する唯一の方法は

MyEntityModel ent = new MyEntityModel();
ent.DeleteObject(theObjectToDelete);
ent.SaveChanges();

ただし、このアプローチでは、オブジェクトを削除するためだけに、まずコントローラーにオブジェクトをロードする必要があります。ID のみを参照するビジネス オブジェクトを削除する方法はありますか?

Linq または Lambda 式を使用するよりスマートな方法があれば、それも問題ありません。ただし、主な目的は、データを削除するためだけにデータをロードしないようにすることです。

4

7 に答える 7

19

Entity Framework が Linq to Entities と Entity SQL の両方をサポートしていることは知っておく価値があります。多くのレコードに影響を与える可能性のある削除または更新を行いたい場合は、ExecuteNonQuery.

Entity SQL では、これは次のようになります。

   Using db As New HelloEfEntities

        Dim qStr = "Delete " & _
                  "FROM Employee"
        db.ExecuteStoreCommand(qStr)
        db.SaveChanges()
    End Using

この例では、dbは myObjectContextです。ExecuteStoreCommandまた、この関数はオプションのパラメーターの配列を取ることにも注意してください。

于 2010-06-13T22:18:04.547 に答える
8

この投稿を見つけました、レコードを削除するより良い方法は実際にはないと述べています。与えられた説明は、このレコードに固有のすべての外部キー、関係なども削除されるため、EF はレコードに関する正しい情報を持っている必要があるというものでした。データを前後にロードしないとなぜこれが達成できなかったのか、私は困惑していますが、それほど頻繁には起こらないので、(今のところ)気にしないことにしました。

この問題の解決策がある場合は、お気軽にお知らせください =)

于 2009-02-02T11:31:39.637 に答える
4

前もって申し訳ありませんが、私はあなたの目標を疑問視しなければなりません.

オブジェクトを読み取らずに削除すると、オブジェクトの削除を確認してから実際に削除するまでの間に、別のユーザーがオブジェクトを変更したかどうかを知ることができません。「プレーンな古い SQL」では、これは次のようになります。

DELETE FROM FOO
WHERE ID = 1234

もちろん、ほとんどの人は実際にこれを行っていません。代わりに、次のようなことを行います。

DELETE FROM FOO
WHERE ID = 1234
  AND NAME = ?ExpectedName AND...

ポイントは、その間に別のユーザーがレコードを変更した場合、削除は失敗する (何もしない) ことです。

これにより、問題をより適切に説明できます。Entity Framework を使用する場合、2 つの解決策が考えられます。

  1. Delete メソッドでは、既存のインスタンスで、プロパティの期待値を比較し、それらが同じ場合は削除します。この場合、Entity Framework は、プロパティ値を含む DELETE ステートメントを作成します。

  2. IDE とその他のプロパティ値の両方を受け入れるストアド プロシージャを作成し、それを実行します。

于 2009-02-02T14:02:48.523 に答える
4

エンティティの EntityKey を再計算することにより、エンティティを偽装する方法があります。ちょっとしたハックのように見えますが、これが EF でこれを行う唯一の方法かもしれません。

取得せずに削除することに関するブログ記事

于 2009-02-11T11:44:00.437 に答える
3
var toDelete = new MyEntityModel{
    GUID = guid,
    //or ID = id, depending on the key
    };
Db.MyEntityModels.Attach(toDelete);
Db.MyEntityModels.DeleteObject(toDelete);
Db.SaveChanges();

キーに複数の列が含まれている場合は、すべての値 (GUID、columnX、columnY など) を指定する必要があります。

何か凝ったものを感じたら、ジェネリック関数についてはこちらもご覧ください。

于 2013-05-08T02:32:14.897 に答える
2

Entity Framework 5 にはEntity Framework Extended Libraryがあります。NuGet で利用できます。次に、次のように書くことができます。

context.Users.Delete(u => u.Id == id);

一括削除にも役立ちます。

于 2013-07-23T07:07:59.473 に答える