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);
'ProgramingTip' 카테고리의 다른 글
특정 버전을 사용하도록 Python 펼쳐서 지시하는 방법 (0) | 2020.11.24 |
---|---|
'체크 아웃되지 않은'브랜치 푸시 (0) | 2020.11.24 |
Android 4.x에서 목록보기의 EditText가 포커스를 잃습니다. (0) | 2020.11.24 |
크기 만 제공하여 Java 에서처럼 Kotlin에서 배열을 생성해야합니까? (0) | 2020.11.24 |
업데이트 할 수 없음 : 추적 된 분기 없음 (0) | 2020.11.23 |