2017-06-22 2 views
1

私はデータベースモデル持っているSQLサーバーでUPDATEクエリを生成します。enter image description hereLINQのは、DELETEは

CONSTRAINT [FK_applications_orders] FOREIGN KEY([ORDER_ID])REFERENCES [DBO]を[受注]([ORDER_ID])

そして、コントローラのアクション:

using (var tx = Database.Database.BeginTransaction()) 
{ 
    var order = Database.Set<Order>().Find(someID); 

    var apps = Database.Set<Applications>().Where(x => x.Order.Id == order.Id).ToList(); 
    Database.Delete(order); 
    tx.Commit(); 
} 

私は、この行var apps = Database...が生成何点検し、これを見るためにSQLプロファイラを開きます。

exec sp_executesql N'UPDATE [dbo].[Applications] 
SET [order_id] = NULL 
WHERE (([application_id] = @0) AND ([order_id] = @1)) 
',N'@0 uniqueidentifier,@1 int',@0=SomeId,@1=SomeOtherId 

なぜSQL ServerでDelete呼び出しがUPDATEクエリを生成するのですか?

+4

あなたはコメントアウトした場合、 'Database.Delete(オーダー);'それはまだ発生していますか? – mjwills

+1

注文を削除するとアプリケーションテーブルが更新され、制約が適用されると思います。 – Stuart

+0

@mjwills私は 'Database.Delete(order)'をコメントアウトするとしません。 –

答えて

3

注文とアプリケーションの間にFK制約があります。

Ordersテーブルから削除すると、EFはApplicatoinsテーブルの更新を行い、この制約を適用します。

EFは、あなたが入ってしまい、更新をしなかった場合は、オーダー(order_id 1言う)を削除するときは、

受注

order_id 
1 
2 

アプリケーション

application_id | order_id 
    100  | 1 
    101  | 2 

次のテーブルを持っています

オーダー

order_id 
2 

アプリケーション

application_id | order_id 
    100  | 1 <---- What is this now ??? 
    101  | 2 

だから、これをnullに設定し、そのフィールドを更新しています。

アプリケーション

application_id | order_id 
    100  | null 
    101  | 2