73

EntityFrameworkCode-Firstを使用してリンクテーブルのカスケード削除を無効にしたい。たとえば、多くのユーザーが多くの役割を持っていて、役割を削除しようとした場合、その役割に現在関連付けられているユーザーがいない限り、その削除をブロックしたいと思います。私はすでにカスケード削除規則を削除していOnModelCreatingます:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    ...
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

次に、ユーザーロールリンクテーブルを設定します。

modelBuilder.Entity<User>()
    .HasMany(usr => usr.Roles)
    .WithMany(role => role.Users)
    .Map(m => {
        m.ToTable("UsersRoles");
        m.MapLeftKey("UserId");
        m.MapRightKey("RoleId");
    });

ただし、EFがデータベースを作成すると、外部キー関係の削除カスケードが作成されます。

ALTER TABLE [dbo].[UsersRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.UsersRoles_dbo.User_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[User] ([UserId])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[UsersRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.UsersRoles_dbo.Role_RoleId] FOREIGN KEY([RoleId])
REFERENCES [dbo].[Role] ([RoleId])
ON DELETE CASCADE
GO

EFがこの削除カスケードを生成するのを停止するにはどうすればよいですか?

4

3 に答える 3

116

私は答えを得ました。:-)これらのカスケード削除は。のために作成されていましたManyToManyCascadeDeleteConvention。リンクテーブルのカスケード削除が作成されないようにするには、この規則を削除する必要があります。

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
于 2012-12-04T14:53:44.150 に答える
6

グローバルにオフManyToManyCascadeDeleteConventionにするのは賢明な選択肢ではないと思います。代わりに、関係するテーブルに対してのみオフにすることをお勧めします。

これは、プロパティの生成された移行ファイルを編集することで実現できますcascadeDelete。例えば:

AddForeignKey("dbo.UsersRoles", "UserId", "dbo.User", "UserId", cascadeDelete: false);

于 2017-12-06T13:23:32.500 に答える
5

私はEbramKhalilに同意します。これは、単一のテーブルに対してオフにするのが良いオプションです。自動的に構築された移行にできるだけ近づけるのが好きなので、OnModelCreatingで設定します。

modelBuilder.Entity<User>()
    .HasMany(usr => usr.Roles)
    .WithMany(role => role.Users)
    .Map(m => {
        m.ToTable("UsersRoles");
        m.MapLeftKey("UserId");
        m.MapRightKey("RoleId");
    })
    .WillCascadeOnDelete(false);

これにより、削除が反対方向に進むことが維持されると思います。したがって、両方をブロックする必要がある場合(この例では意味があります)、次のコマンドで同様の呼び出しを行う必要があります。Entity<User>(Role)

もちろん、これは質問がされてから何年も経ちます。そのため、2012年には有効ではなかった可能性があります。

于 2018-01-09T22:14:31.420 に答える