5

나는 다 대다 관계가있다 :many to many 관계에서 삭제하는 방법?

제품에는 많은 종류가 있고 종류에는 많은 제품이있다.

내가 지금은 Shopping Category을 삭제
Shopping Category 
Food Category 

Product A - Shopping Category, Food Category 
Product B - Shopping Category 

을 말해봐. Product A 참조를 Shopping Category에서 삭제하고 Product B을 완전히 삭제하고 싶습니다.

내가 끝낼 것 :

Product A - Food Category. 

을 나는 (나는 유창한 NHibernate에 사용하고 있습니다) NHibernate에이 작업을 수행하려면 어떻게합니까.

캐스케이드 DeleteOrphanAllDeleteOrphan을 사용하려고했지만 쇼핑을 삭제하면 제품 A와 B가 모두 삭제됩니다.

public class CategoryMapping : ClassMap<Category> 
{ 
    public CategoryMapping() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 

     Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize(); 
     HasManyToMany(x => x.Products).Cascade.DeleteOrphan(); 
    } 
} 


public class ProductMapping : ClassMap<Product> 
{ 
    public ProductMapping() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize(); 
     HasManyToMany(x => x.Categories); 
    } 
} 

    unitOfWork.BeginTransaction(); 
    Category category =session.Load<Category>(id); 
    session.Delete(category); 
    unitOfWork.Commit(); 

답변

2

나는 이것이 기존 데이터 구조와 매핑하여 처리 할 수 ​​있다고 생각하지 않습니다. 수동 코드 (*)를 작성하거나 데이터 구조를 변경해야한다고 생각합니다.

는하지만 작동하지 100 % 확실

(*) ... 다른

unitOfWork.BeginTransaction(); 
Category category =session.Load<Category>(id); 
var productsDel = category.Products.Where(p => p.Categories.Count == 1); 
productsDel.ForEach(p => session.Delete(p)); 
session.Delete(category); 
unitOfWork.Commit(); 

: 나는 또한 교차 심판 테이블 매핑을 추가하는 방법에 대해 생각하고

. 그런 다음 매핑을 구성하여 해당 교차 참조 테이블의 레코드 만 삭제할 수 있어야합니다. 참조가없는 제품이 있는지 확인하고 주기적으로 삭제해야합니다. (일부 저장 프로 시저 실행과 같은주기적인 정리 코드). 나는이 솔루션이 나쁜 냄새가 난다는 것을 알고있다.) 여전히 트리거와 다른 SQL Server의 것들이있다. 어쨌든 좋은 해결책은 아니지만 해결책이다.

0

당신은 단지 두 사용 사이의 연결을 제거하려면 Cascade.SaveUpdate()

당신이 트랜잭션을 사용하는 경우 세션을 수행해야합니다하지 않을 경우

그럼 그냥 컬렉션에서 개체를 제거하고 트랜잭션을 커밋 .Flush

+0

나는 이해할 수 없다. 나는 saveUpdate가 그것을 재 저장하고 컬렉션에서 엔티티를 제거함으로써 무엇을 의미하는지 확신 할 수 없다고 생각했다. 나는 카타고리를 삭제할 때 제거해야 할 참조를 필요로하는 제품 1000 개를 가질 수 있으므로이 캐스케이드가 나 자신을 위해해야 ​​할 일이 될 것 같다. – chobo2

+0

질문에 대한 오해가 있었을 지 모르지만이 경우 DeleteOrphan 및 AllDeleteOrphan이 제품 A를 삭제하는 이유를 분명히 알 수 있습니다. 'SaveUpdate'는 연관 (많은 테이블 항목 ...'product_category')만을 삭제하지만'Product A'는 삭제하지 않을 것입니다. 이것은이 계단식 설정을 사용할 때 수동으로 처리해야하는 항목입니다. 나는 이것을 처리하는 캐스케이드가 있다고 생각하지 않는다. –

+0

흠 나는 그것을 시험해야 할 것이다. 그러나 나는 DeleteOrphan이이 상황에 정확히 맞다고 생각했다. 나는 제품 A가 여전히 무언가와 관계가 있기 때문에 고아가 아니다. – chobo2