2011-12-27 13 views
11

プライマリキーを使用して、Linqでエンティティに削除する方法が組み込まれていますか?エンティティへのLinqの削除

現在メートルの仕事は周りの私はちょうど

このcontext.DeleteTable(ID)ですん

、その後、エンティティにC#のLINQで(表はテーブル名である)DeleteTableと呼ばれるストアドプロシージャを作成することです最良の方法?他にどんな選択肢がありますか?

答えて

11

データベースにアクセスしてオブジェクトのすべてのフィールドを取得したくない場合は、クラスの新しいインスタンスを作成し、新しいコンテキストにアタッチして削除し、変更を保存できます。これにより、EFは適切な削除コマンドを生成することができます。

using (var context = new MyContext()) 
{ 
    var myObject = new MyObject { ID = 3 }; 
    context.MyObjectSet.Attach(myObject); 
    context.MyObjectSet.DeleteObject(myObject); 
    context.SaveChanges(); 
} 

注:これは、存在しないオブジェクトを削除しようとしている場合を除きます。これは、オブジェクトが存在することがわかっている場合にのみ適切です。

注2:これは

+0

これは本当に機能しますか?甘い!それは役に立つでしょう。 +1 – BZink

+1

それは動作しますが、EFで生成された削除コマンドがID以外のフィールドを参照していない場合にのみ機能すると付け加えておきます。タイムスタンプフィールドがある場合、EFは生成されたクエリにそのフィールドを含めますが、使用する値がわからないためクエリが間違っています。 – hvd

5

デフォルトの方法は、エンティティに問い合わせて、.DeleteObject(...)メソッドを発行することです。

+1

内部の使用これは、このDBに2回の旅行を必要としませんか? – michael

+0

はい。明示的なストアドプロシージャをマップまたは呼び出したくない場合は、オプションが限られています。 –

+0

@マイケル「アタッチ」には旅行は必要ない? –

1

は、次のような文脈のを離れてあなたのニーズに実行するコマンドを使用します。あなたはDbSet<T>.Remove(entity)(バージョン4.1、4.2)を使用することができますHTH

+0

エンティティへのリンクにExecuteCommandメソッドがありますか?それともSQLへのリンクのみですか? – michael

+0

私の悪いです。 EFのExecuteStoreQueryを参照してください。方法:データソースに対してコマンドを直接実行する方法を参照してください(http://msdn.microsoft.com/en-us/library/ee358769.aspx)HTH – OmegaMan

+0

ありがとう、私はエンティティへのリンクからこれを直接行うことはできませんでした。 – michael

2

mycontext.ExecuteCommand("DELETE FROM MYTABLE"); 

または

mycontext.ExecuteCommand("TRUNCATE TABLE MYTABLE"); 

EntitySet<T>.Remove(entity)(バージョン1.0,4.0)メソッド:

YourDbContext.Table.Remove(entityObject); 
+0

エンティティを削除する前にエンティティを選択する必要があると思いますか?したがって2回の旅行..私は間違っていますか? – michael

+0

はい、エンティティを照会するか、@ hvdによって提案された「Attach」アプローチを使用することができます – Jan

2

生成は、コマンドリファレンスにID(ないタイムスタンプのプロパティを意味しない、またはクエリに含まれることになる同様のもの)よりも他のフィールドを削除しないように、あなたのエンティティを設定したと仮定しDeleteObjectメソッドを使用して、削除するアイテムを検索してから削除します。

Dim itemToDelete = (From u In db.SOME_TABLE Where u.ID = ID).FirstOrDefault 
db.SOME_TABLE.DeleteObject(itemToDelete) 
db.SaveChanges() 

のtry catchブロック

+0

これはDBへの2回の旅行ですか? (つまり、select * from some_Table where id = Id)次に(some_tableからfooを削除します。)? – michael

+0

はい、しかし、あなたはほとんどのSPを使用してDBを2回往復する必要はないが、あなたがマップしない場合は、Insert、Update、DeleteコマンドをSPにマップすると、UpdateException例外が発生します。 – Piyey

関連する問題