2009-05-30 16 views
4

私はASP.NET MVCでAdo.Net Entity Frameworkを使用しています。例えば、私が持っている私のMSSQL 2008データベース以下の単純化されたテーブルとの関係でADO.NET Entity Framework:自動カスケード削除を取得するには?

(Song) 1--* (Version) 1 -- 1 (VersionInfo) 

が、それは自動的に私が歌を削除するとリンクバージョンとそれらのVersionInfoのは、削除してしまったことは可能ですか?

いくつかのテーブルには、最大8体の関係を持っており、それらの関係があまりにも時々subrelationsを持っているので、現在、私は、手動で多くの作業で、次のコードのようなものを使用しています:

db = new Database() //Entities 
    Song song = db.Song.First(); 

    Song.Version.Load(); 

    foreach(Version version in Song.Version.ToList()) 
    { 
     //Remove Song-Version Reference. 
     song.Version.Remove(version); 


     //Get The VersionInfo so we can delete it after we deleted the Version object. 
     version.VersionInfoReference.Load(); 
     VersionInfo versionInfo = version.VersionInfo; 

     //Now we can delete the Version Object. 
     db.DeleteObject(version); 
     //Now we can also delete the versionInfo, since the reference is gone. 
     db.DeleteObject(versionInfo); 

    } 

    db.DeleteObject(song); 

容易に存在する必要がありますカスケード削除を取得する方法。私はすでに、削除時にカスケードにMSSQLの関係設定を設定しようとしましたが、それはできませんでした...私はそこに何かを逃したのですか?

とにかく、この問題を他の人がどのように解決するのですか?

答えて

2

これは、Entity Frameworkで行うべきではありません。すべての一般的なリレーショナルデータベースでは、外部キーのON CASCADE DELETEがサポートされています。私はちょうどそれと一緒に行くことをお勧めします。

あなたのケースでは、ソングの削除をカスケードしてバージョンにし、バージョンをバージョン情報に削除する必要があるかもしれません。 SQL Designerでテーブルデザイナをロードするだけで、関係の下に関連するオプションが表示されます。

0

データベースで正しく設定すると、間違いなく削除がカスケードされます。私はエンティティフレームワークの次のバージョンでこれを改善したと思いますが、私は確信していません。私はどこかカスケードを見て覚えています。もう一度データベースを見てみることをお勧めします。

たとえば、カスケード接続する必要がある他の関係はありますか?

1

私は単純なデータベースで2つのテーブルを試してみましたが、カスケードは1の数多くの1つの側からのみであることがわかりました。関係は、A.b_idとB.idの間に設定されます。 削除ルールがカスケードされています。

Aを削除すると、Bは削除されません。 Bを削除するとAが削除されます。

問題は、私はAを削除するとBを削除したいと思います。これは手動でのみ可能です。

+0

Aを削除すると、問題なくBが引き続き存在します。しかし、Bを削除すると、Aは存在しません(それはBを指しているため、もう存在しません)。カスケード削除は、項目(B)を削除すると他の項目(A)が正しくないか、または外部キー制約に違反する場合にのみ発生します。 – Flater

0

EFのRTMで、デザイナーで関係を選択し、F4キーを押してプロパティを表示します。 2つのOnDeleteプロパティ(関係の各側に1つずつ)が「none」に設定されています。いずれかの側を「カスケード」に設定することができます(親に設定する必要があります)

関連する問題