0

I EMP를 부서 &를 나타내는 다음 두 엔티티 세트를 가지고있다 - 지금엔티티 프레임 워크는 삭제 부모와 화염의 SaveChanges를()에 아이의 기록을 구현 않는 방법

public partial class Dept 
{ 
    public Dept() 
    { 
     this.Emps = new HashSet<Emp>(); 
    } 

    public int DeptID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<Emp> Emps { get; set; } 
} 


public partial class Emp 
    { 
     public int EmpID { get; set; } 
     public string Fname { get; set; } 
     public string Lname { get; set; } 
     public int DeptID { get; set; } 

     public virtual Dept Dept { get; set; } 
    } 

나는이 테스트 작업 방법, 의지를 썼다을 다음과 같이 하나의 EMP를이 할당 가지고 부서를 삭제하려고 : -

public ActionResult Test() 
{ 
      Dept d = db.Depts.SingleOrDefault(a=>a.id ==1); 
      Emp e = db.Emps.SingleOrDefault(a => a.id == 100); 
      db.Entry(d).State = EntityState.Deleted; 


      db.Emps.Remove(e); 
      db.SaveChanges(); 
      return Content("done"); 
} 

내가이 액션 메소드를 호출 할 때 id=1Dept가 이미 EMP w이 있기 때문에 예외가 제기 될 것으로 생각 ith id = 100. 그러나 EF가 먼저 emp를 제거한 다음 부서를 삭제했습니다. 위의 동작 방법으로 id = 1 인 idpt와 id = 100을 가진 emp를 모두 삭제했습니다.이 점에 대해 조언 해 주실 수 있습니까? 나는 단지 부서를 삭제하려고하면 마음에 베어링은 다음과 같은 것을 :

public ActionResult Test() 
{ 
       Dept d = db.Depts.SingleOrDefault(a=>a.id ==1); 
       //Emp e = db.Emps.SingleOrDefault(a => a.id == 100); 
       db.Entry(d).State = EntityState.Deleted; 

       //db.Emps.Remove(e); 
       db.SaveChanges(); 
       return Content("done"); 
} 

나는 다음과 같은 예외를 얻을 것이다 : - 참조 제약 \ "FK_Emp_ToTable \"와 충돌

DELETE 문. 충돌은 데이터베이스 \ "C : \ USERS \ ... \ DOCUMENTS \ VISUAL STUDIO 2013 \ PROJECTS \ WEBAPPLICATION19 \ WEBAPPLICATION19 \ APP_DATA \ DATABASE1.MDF \"테이블 \ "dbo.Emp \"열 'DeptID'에서 발생했습니다. \ 연구 \의 n이 문이 종료되었습니다. "}

그래서 EF는 이러한 시나리오를 구현하는 방법에 대한 누군가의 조언?

편집

난 내 행동 방식에 대한 SQL 프로파일 러를 확인하실 수 있습니다 나는 다음과 같은 2 삭제 된 SQL 문장을 지적 : -

exec sp_executesql N'delete [dbo].[Emp] 
where ([EmpID] = @0)',N'@0 int',@0=100 

exec sp_executesql N'delete [dbo].[Dept] 
where ([DeptID] = @0)',N'@0 int',@0=1 

그래서 emp를 삭제 한 다음 EF가 순서를 결정하는 방법을 알기에 충분히 똑똑하다고 언급했지만이 동작을 어떻게 관리할까요?

답변

1

컬렉션에 Emp이 할당되어 삭제하려고했습니다. EMP를 관계 -

다음 예외는

부서에 제약이 있다는 의미 REFERENCE 제약

와 충돌 DELETE 문

발생했습니다. 제 생각에 그것은 하나의 Dept가 Emp에게는 선택 사항 인 일대 다 관계입니다.

외래 키 DeptIDNullable<int>이기 때문에 선택 사항이라고 말할 수 있습니다.

Dept을 삭제하려고하면 dept가 Emp에 참조되어 있기 때문에 예외가 발생합니다.그런 다음 기본 키

Dept d = db.Depts.SingleOrDefault(a=>a.id ==1); 
    Emp e = db.Emps.SingleOrDefault(a => a.id == 100); 

에 의해 삭제 그리고 첫 번째 작업 방법에서

은 삭제 사이의 관계를 표시하는 db.Emps.Remove(e);을 사용했다. 단지 내가 두 SQL Delete statements는 관계 불렸다 참조 귀하의 경우에 SQL Update.

는를 식별 그에 인 관계가 옵션 인 경우, Emp 사용 NULL로 설정된다.

주체 엔터티의 기본 키가 종속 엔터티의 기본 키의 일부인 경우 관계는 식별 관계입니다. 식별 관계에서 종속 엔티티는 주체 엔티티 없이는 존재할 수 없습니다. 이 제약 조건은 식별 관계에서 다음 동작을 발생시킵니다.

종속 개체를 삭제하면 종속 개체도 삭제됩니다. 이는 모델에서 관계를 지정하는 것과 같은 동작입니다.

관계를 제거하면 종속 대상이 삭제됩니다. EntityCollection에서 Remove 메서드를 호출하면 관계와 삭제할 종속 개체가 모두 표시됩니다.

+0

귀하의 회신은 내 질문과 관련이 없다고 생각합니다. 거기에 아무 계단식 삭제, 두 번째 작업 메서드를 시도하는 경우 예외가 발생합니다, 그래서 어떻게 캐스케이드 예외가 삭제됩니다 !!! –

+0

그리고 내 주요 질문은 예외에 관한 것이 아니라 첫 번째 액션 메소드가 예외를 발생시키지 않았던 방법입니다! 1 –

+0

내 대답을 업데이트했습니다. 그것이 당신에게 맞는지보십시오 – GMich