2014-05-15 2 views
1

내 응용 프로그램에는 광고를 여러 슬롯에 추가 할 수 있도록 "슬롯"과 "광고"를 매핑하는 1 - 많은 관계가 있습니다.자녀가 없을 때 부모가 삭제되도록하려면 어떻게해야합니까?

Slot (id, location) 
Advert (slot_id, text, url) 

그러나 모든 슬롯에서 광고가 제거되면 삭제하는 것이 좋습니다.

나는이 작업을 수행하는 가장 좋은 방법은 Slot.Advert 설정자와 Advert.Slots.Remove() 메서드에 대한 검사를 추가하는 것이므로 최종 관계를 제거하는 경우 해당 광고를 삭제할 수 있다고 생각했습니다. 그러나

public class Slot 
{ 
    public int Id { get; set; } 

    public int? AdvertId { get; set; } 

    private Advert _Advert; 
    public virtual Advert Advert 
    { 
     get 
     { 
      return _Advert; 
     } 

     set 
     { 
      if (_Advert != value && _Advert != null && _Advert.Slots.Count == 1) 
      { 
       // How do I delete the _Advert here? I have no access to the context? :(
      } 

      _Advert = value; 
     } 
    } 
} 

는 위에서 볼 수 있듯이, 나는 setter에서 "컨텍스트"인스턴스 없어, 그래서 고라를 삭제할 수 아니에요. 일을

I 새로운 컨텍스트를 열 수하는 동안, 그래서

  • 고라가 삭제되고 새로운 고라는 트랜잭션되지 않을 것 슬롯에 적용 (두 개의 분리 된 상황에서 일어나는 잘못된 느낌 사이).

누구에게 어떤 옵션이 있는지 알고 있습니까? POCO 토지에 있고 Entity Framework 6.1을 사용 중입니다.

답변

1

컨텍스트에 맞게 SaveChanges 메서드에서 수행하십시오.

public override int SaveChanges() 
{ 
    foreach (var entry in ChangeTracker.Entries<Advert>().Where(e=>e.Entity.Slots.Count()==0)) 
    { 
     entry.State = EntityState.Deleted; 
    } 
    return base.SaveChanges(); 
} 
+1

모든'SaveChanges' 호출에 대해'Foreach' ?? 성능 문제가 있습니까? – saber

+1

SaveChanges는 얼마나 자주 호출됩니까? 메모리 내 객체를 검사하고 있습니다. 얼마나 많은'Advert '엔티티가 주어진 시간에 추적되고 있습니까? 나는 그것이 문제가 될 것이라고 생각하지 않지만, 물론 당신의 마일리지는 다를 수 있습니다. –

+0

@JC :이 상황에서 변경 추적기가 어떻게 작동하는지 조금 확신 할 수 없습니다. 예를 들어,'slot.Advert = null'을 직접 실행 한 경우, 변경 사항 추적기에 'Advert'가 표시됩니다 (특별히 메모리에로드하지 않았더라도 지연로드를 사용합니다). – Isaac

관련 문제