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=1
와 Dept
가 이미 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 –
내 대답을 업데이트했습니다. 그것이 당신에게 맞는지보십시오 – GMich