0

最初にエンティティ フレームワーク 5 モデルを使用しています。

私のモデルにはいくつかのエンティティがあり、それらのほとんどは、削除および更新時に「アクションなし」の外部キー制約を持つ1対多の関係を持っています。

しかし、エラーなしで父と子のオブジェクトを削除することはできます (EF4 では、オブジェクトを参照している別のオブジェクトがあるため、オブジェクトを削除できないという例外警告が表示されていました)。

最初に EF5 モデルによって生成されたコードの一部:

...
... Create all tables...
...
... Create all foreign key constraints ... 
...
-- Creating foreign key on [TEstTela_ID] in table 'TEstPermissao'
ALTER TABLE [dbo].[TEstPermissao]
ADD CONSTRAINT [FK_TEstTelaTEstPermissao]
FOREIGN KEY ([TEstTela_ID])
REFERENCES [dbo].[TEstTela]
    ([ID])
ON DELETE NO ACTION ON UPDATE NO ACTION;
....

オブジェクト コードの削除:

...
EstContextDB CurrentContext = new EstContextDB();  // inherits from DbContext

CurrentContext.Set<TEstTela>().Remove(currentTEstTelaEntity);
CurrentContext.SaveChanges();  /* Exception should be thrown here
 because at least one TEstPermissao object references this
 currentTEstTelaEntity but it still delete the object without
 errors or exceptions, and plus the TEstPermissao object
that references this currentTEstTelaEntity gets its reference as 'null' */
4

1 に答える 1

1

問題はカスケード削除とは関係ありません。親を削除しようとするTEstTelaEntityと、EF は子TEstPermissaoからこの親TEstTelaEntityへの外部キーを設定しnull(明らかに関係はオプションです)、子の UPDATE ステートメントと親の DELETE ステートメントをデータベースに送信します。カスケード削除が開始されると、親だけでなく子も削除されます。結果は一貫性があり有効ですTEstPermissao。.TEstTelaEntity

外部キーはnull、親を削除したときに子がロードされてコンテキストにアタッチされた場合にのみ に設定されます。そうしないと、予期している制約違反に関する例外が実際に発生します。(アタッチされた子とデタッチされた子の間のこの違いは、EF 4 と EF 5 で同じだと思います。)

子がある限り親を削除したくない場合は、適切なコードで親に子があるかどうかを確認して、 をRemove呼び出すかどうかを決定してください。

于 2013-10-10T21:34:45.010 に答える