0

나는 다 대다 관계에 참여하는 두 명의 POCO가 있습니다. "A"에는 "B"의 콜렉션이 있지만 "B"에 "A"콜렉션이 필요하지 않습니다. "B"를 삭제하면 Join 테이블의 레코드가 제거되지 않습니다. Entity Framework에서는 Navigation 속성이있는 경우 Join 레코드 만 삭제합니다. 이게 맞습니까? 아니면 다른 방법이 있습니까?EF 코드에서는 먼저 다 대다 관계를 삭제하기위한 탐색 속성이 필요합니까?

예 : 역할이 삭제 될 때이 시나리오에서는

public class User() { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Role> Roles { get; set; } 
} 

public class Role() { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

//... Mapping Config ...// 
this.HasMany(x => x.Roles) 
    .WithMany(/*can't be expressed without navigation property*/) 
    .Map(m => { 
     m.MapLeftKey("Users_Id"); 
     m.MapRightKey("Roles_Id"); 
     m.ToTable("UserRoleLinks"); 
    }); 

//... Deleting a Role that is in use ...// 
using(var ctx = new MyDbContext()) { 
    var role = ctx.Roles.Find(1); 
    ctx.Roles.Remove(role); 
    ctx.SaveChanges(); 
} 

가의 UserRoleLinks 레코드가 고아가 될 것이다. Mabye를 구성하는 다른 방법이 있습니까?

답변

1

아무 문제없이 작동합니다. 기본값 ManyToManyCascadeDeleteConvention은 계단식 삭제를 사용하여 관계로 접합 테이블을 작성하도록 EF를 강제합니다. Role 엔티티에 누락 된 탐색 속성이 영향을 미치지 않습니다. 당신의 문제에 대한

그래서 가능한 이유 : 접합 테이블에서 당신은 폭포 누락

  • 이 관계를 삭제

    • 당신이 언급 한 제거 대회 - 예를 들어, 앞으로 일어날이 캔 기존 데이터베이스와 유창함 API를 사용하여.
  • +0

    나는 이것을 시도 할 것이다. 캐스케이드 삭제는 EF에서 데이터베이스와 협약에 따라 활성화해야합니까? EF가 조인 레코드를 삭제하려고 시도했을 때 데이터베이스에서 삭제 기능을 사용하면 데이터베이스가 삭제된다는 사실을 읽은 것으로 보았습니다. – jedatu

    +0

    기본 외래 키가 단수 인 다른 RC 4.1 문제로 인해이 작업을 수행 할 수 없습니다. withMany (r => r.Users)로 WithMany를 정의하지 않으면 EF는 Users_Id 대신 User_Id를 사용하려고하기 때문에 필드 이름을 잘못 가져옵니다. 또한 사용자의 역할에서 Navigation 속성을 사용하지 않으면 WithMany를 정의 할 수 없습니다. – jedatu

    +0

    여기에 두 가지 질문이 있습니다. 캐스케이드 삭제에 관해서는이 답변이 적용됩니다. 데이터베이스에 적용하여 효과적으로 문제를 해결했습니다. 다른 문제는 당신이 "많은"컬렉션 속성을 가진 상호성을 표현하지 않을 때, EF는 유창한 표현에서 제공된 것보다는 외래 키를 추측한다는 것입니다. – jedatu

    관련 문제