ProgramingTip

EF 코드 우선에서 링크 테이블에 대한 계단식 삭제를 중단하는 방법은 무엇입니까?

bestdevel 2020. 11. 24. 08:16
반응형

EF 코드 우선에서 링크 테이블에 대한 계단식 삭제를 중단하는 방법은 무엇입니까?


엔터티 프레임 워크 코드 우선으로 링크 테이블에 대한 계단식 삭제를하고 싶습니다. 예를 들어, user-가 많은 많은 역할을 가지고 있고 역할을 삭제하려는 경우 현재 해당 역할에 연결된 user-가없는 경우 해당 삭제가 차단되기를 원합니다 . 이미 내에서 계단식 삭제 규칙을 제거했습니다 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

이 삭제 캐스케이드를 어떻게 중지 할 수 있습니까?


나는 답을. :-) 계단식 삭제는 ManyToManyCascadeDeleteConvention. 연결 테이블에 대해 계단식을 생성하지 않도록해야합니다.

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

저는 Ebram Khalil이 단일 테이블을 끄는 것이 좋은 선택이라는 데 동의합니다. 그러나 가능한 한 자동으로 빌드 된 마이그레이션에 가깝게 유지하고 싶고 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 년에는 유효하지 않을 수 있습니다.


ManyToManyCascadeDeleteConvention전 세계적으로 끄는 것은 현명한 선택이 아니라고 생각합니다 . 대신 해당 테이블에 테이블 해제하는 것이 좋습니다 .

이는이 속성에 대해 마이그레이션 파일을 편집하여 수행 할 수 있습니다 . 예를 들면 :cascadeDelete

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

참고 URL : https://stackoverflow.com/questions/13705441/how-to-disable-cascade-delete-for-link-tables-in-ef-code-first

반응형