0

重複の可能性:
Entity Framework でオブジェクトとそのすべての子オブジェクトを削除しますか?

このコード:

        int WebsiteID = int.Parse(Request.QueryString["id"]);
        Website websiteObj = db.Websites
            .SingleOrDefault(x => x.website_id == WebsiteID);

        foreach (BusinessObjects.Page pageObj in websiteObj.Pages)
        {
            foreach (SubPage subpageObj in pageObj.SubPages)
            {
                pageObj.SubPages.Remove(subpageObj);
            }
            websiteObj.Pages.Remove(pageObj);
        }

        foreach (Sector sectorObj in websiteObj.Sectors)
        {
            foreach (Product productObj in sectorObj.Products)
            {
                sectorObj.Products.Remove(productObj);
            }
            websiteObj.Sectors.Remove(sectorObj);
        }
        db.Websites.DeleteObject(websiteObj);

Web サイトには複数のページがあり、ページには複数のサブページがあります。ウェブサイトにも複数のセクターがあり、各セクターには複数の製品があります。

Web サイトを削除し、それに関連するすべての関係とエンティティを消去したいと考えています。上記を書くためのより良い方法があると確信しています。

ロジックを改善する方法はありますか?

4

1 に答える 1

4

最も簡単な方法は、データベース内の関係を次のように設定することです。ON DELETE CASCADE

次に、Linq は次のようになります。

var sites = db.Websites;
var site_id = int.Parse(Request.QueryString["id"]);
var site = sites.FirstOrDefault(x => x.website_id == site_id);
sites.DeleteObject(site);

カスケードを削除する場合に不要になったものを削除することを除いて、linqに加えた唯一の実際の変更は次のとおりです。

FirstOrDefaultパフォーマンスをわずかに向上させるために使用します。TOP 2実装するだけなので、これはデータベースでは大した問題ではありません。それ以外のSingle場合は、すべてのオブジェクトを検査する必要があることを意味する可能性があるため () に対して実行するFirst唯一の方法です)。もちろん、同じ id を持つ 2 つのサイトが存在する可能性がある場合は、バグを導入したことになりますが、実際のバグは、id を主キーとして使用しないことで、これが発生しないようにすることです。SingleList<T>

Objオブジェクトの名前を取り出します。これは「オブジェクト」の略で、したがって同語異義語のように見えます。これまでに記述された .NET コードのすべての部分の他のすべての変数はオブジェクト用であるため、これを指摘しても意味がありません。

*悪い習慣を助長したくないので、これについてもう少し。一致するオブジェクトが 1 つしかない場合は、そのオブジェクトを取得しFirstながらそのオブジェクトを取得し、それが唯一のものであることを確認します (オブジェクトがまったく見つからない場合に異なることを除いて、バリアントにも同じことが当てはまります)。SingleOrDefault

一致するオブジェクトが 1 つしかないことを確認する唯一の方法は、少なくとも 2 つのオブジェクトを見つけてから、1 つしか取得していないことを確認することです。TOP 2これは、データベース テーブルが検索に関連する列にインデックス付けされている場合 ( a の代わりに a を実行する場合)、データベース テーブルに与える影響はわずかですが、それ以外のTOP 1場合は深刻になる可能性があります。

問題は、そのチェックが行われることがどれほど重要かということです。気にしないこともあります。使用してFirstください。場合によっては、そのようなオブジェクトが 1 つしかないという強い確信を持つ必要があります。使用しますFirstが、その信頼の理由を確認して、バグがないことを確認してください (この場合、インデックス列に主キーまたは一意のキーがあることを確認してください)。本当に確認する必要がある場合は、使用してください。そのSingleようFirstな場合に使用することは、不適切な最適化の典型です。高速であっても、間違っていることは決して目標ではありません。

于 2012-08-26T10:46:13.877 に答える