0

削除する必要があるテーブルがありますが、それを参照する外来キーが多数あります。私は決して使用したことがありませんON DELETE CASCADE - 私たちはレコードをソフトに削除するような種類のルールを持っています。ハード・デリートが絶対に必要な場合は、削除前/削除後のリンク・テーブルを手動でクリーンアップする必要があります。Entity Frameworkでカスケード削除を強制する

特定のテーブル(およびそのテーブル内のレコード)を取得し、リンクされているデータベース内のすべてのテーブル/レコードを繰り返し処理し、削除を実行する方法やヘルパ関数があります。私は今これがあまりにも練習ではないと信じたい。

です。スキーマ:私はどこOrganisationID = 3 ...

を削除したい場合は

Organisations (OrganisationID, Name) 

Users (UserID, FirstName, LastName, OrganisationID) 
Projects (ProjectID, Name, OrganisationID) 
Organisations_Markets (OrganisationID, MarketID) 

Tasks (TaskID, Description, UserID) 

私はSQLのすべてのFKS一覧表示する方法があります知っている - EXEC sp_fkeys 'Organisations'が。どのように私はEFでこれを行うことができ、任意の入れ子FKのためにそれを行うことができます。したがって、上記の例では、最初の削除はTasksテーブル(OrganisationID = 3の場合はUsersにリンクされているレコード)などになります。

編集: - 合計で100の以上の行が存在することは決してないだろう - パフォーマンスが問題ではないので、私はあなたのモデルでは、削除

答えて

0

のためのEFを使用して幸せ、標準の1にあるようですOrganizationUsersとの間、およびOrganizationProjectsの間の多くの関係。

したがって、Organizationはすべて0以上です。すべてのUserは正確に一つのOrganization

は同様にすべてのOrganizationがゼロ以上の「プロジェクト, everyプロジェクトbelongs to exactly one Organization`を持っているに属します。

また、Organisation_Marketsと記載されています。これは指定しませんが、OrganizationMarketの多対多関係の接合テーブルのようになります。すべてOrganizationはゼロ以上を指しますMarkets; Marketは0またはそれ以上を指しますOrganizations

に続いてone-to-manymany-to-manyの関係を設定する場合は、安全にOrganizationを削除できます。

エンティティフレームワークは、OrganizationからすべてUsersProjectsを自動的に削除します。このOrganizationを参照するMarketsは、削除されたOrganizationをもう参照しません。しかし、Marketは、Organizationをまったく参照することができないので、Organizationsを除いたMarketsは削除されません。

class Organization 
{ 
    public int Id {get; set;} // Primary key 
    // an Organization has zero or more Users (one-to-many): 
    public virtual ICollection<User> Users {get; set;} 
    // an Organization has zero or more Projects (one-to-many): 
    public virtual ICollection<Project> Projects {get; set; 

    // an Organization refers to zero or more Markets (many-to-many) 
    public virtual ICollection<Market> Markets {get; set;} 
} 

class User 
{ 
    public int Id {get; set;} // Primary key 
    // every User belongs to one Organization using foreign key 
    public int OrganizationId {get; set;} 
    public Organization Organization {get; set;} 
} 

class Project 
{ 
    public int Id {get; set;} // Primary key 
    // every Project belongs to one Organization using foreign key 
    public int OrganizationId {get; set;} 
    public Organization Organization {get; set;} 
} 

class Market 
{ 
    public int Id {get; set;} // Primary key 
    // every Market refers to zero or more Organizations (many-to-many) 
    public virtual ICollection<Organization> Organizations {get; set;} 
} 

class MyDbContext : DbContext 
{ 
    public DbSet<Organization> Organizations {get; set;} 
    public DbSet<User> Users{get; set;} 
    public DbSet<Project> Projects{get; set;} 
    public DbSet<Market> Markets{get; set;} 
} 

それだけです。エンティティフレームワークのコーディング規約に従ったので、エンティティフレームワークは1対多の関係と多対多の関係を認識し、適切な外部キーを作成します。たとえそれについて言及しなかったとしても、多対多関係に必要な接合テーブルを作成することさえできます。

ところで、私は接合テーブルは必要ありません。私が組織に所属するすべてのマーケットを希望するなら、プロパティーOrganization.Marketsを使用します。 Entityフレームワークは、接合テーブルとの結合が必要であることを認識し、適切なSQLコードを作成します。

異なるテーブル名などのデフォルト値を使用しない場合は、fluent-APIまたはデータアノテーションを使用することを検討してください。今の組織を除去するための

はこのような何かを:

using (var dbContext = new MyDbContext()) 
{ 
    Organization organizationToRemove = dbContext.Organizations 
     .Where(organization => ...) 
     ... etc. 
    dbContext.Organizations.Remove(organizationToRemove); 
    dbContext.SaveChanges(); 
} 

エンティティフレームワークが自動的にOrganizationのすべてUsersOrganizationのすべてProjectsがある

  • を除去して、他のテーブル

    • を更新します削除されました
    • へのすべての参照すべてMarketsのが削除されます。

    削除したOrganizationへの参照をすべてきれいに整理する特別な機能は必要ありません。 Entity Frameworkはこれを正しく行います。

  • +0

    時間をいただきありがとうございます。 'DELETE文がREFERENCE制約と衝突しました... '(ただし、このプロジェクトではEF 6を使用しています)。私は、最初にコードを使用するのではなく、DBを最初に使用すると付け加えるべきです。あなたはここで正しいかもしれませんが、それは起こっていないだけです。もし私がそれを理解したら、私は答えを投稿します.. – user982119

    関連する問題