2017-09-20 3 views
2

탐색 속성을 null로 설정하면 참조 된 개체도 자동으로 삭제되도록 EFT 6.x와 1 : 0..1 관계를 설정하는 방법은 무엇입니까?참조를 null로 설정하면 참조 된 개체가 자동으로 삭제되도록 1 : 0..1 관계를 설정 하시겠습니까?

예 : 제대로

Student may have 0..1 StudentDetails 

var student = new Student(); 
student.Details = new StudentDetails(); 
dbContext.Students.Add(student); 
... 
student.Details = null; 
dbContext.SaveChanges(); // should automatically delete the StudentDetails object 

설치 방법에 관계? 나의 현재의 시도는 다음과 같습니다

modelBuilder.Entity<Student>() 
     .HasOptional(x => x.Details) 
     .WithRequired(); 

그러나,이 작동하지 않습니다 :(

+0

이 데이터베이스는 먼저 사용 하시겠습니까? –

+0

코드 첫 번째, 유창한 구성 –

+0

'dbContext.StudentDetails.Remove (student.Details);'EF는 엔터티를 null로 설정하면 아무 것도하지 않습니다. –

답변

2

의 관계 설정이 정확하고 캐스케이드 삭제할 수 있도록 원하는 동작 (나는 위해 WillCascadeOnDelete()를 추가 제안 생산해야하는 일대일 관계에 대한 기본값은 꺼져 있지만 문제의 동작에는 영향을주지 않습니다.) null으로 설정하기 전에 Details 속성을로드해야 컨텍스트에 의해 변경된 것으로 감지 되려면 Details 속성을로드해야합니다동안 추적기를 변경하고 데이터베이스에서 삭제했습니다.전화.

여러 가지 방법으로이를 수행 할 수 있습니다. 예를 들어, 개체 검색 중 열망로드는 :

var student = dbContext.Students 
    .Include(s => s.Details) // <-- 
    .FirstOrDefault(s => s.Id == ...); 

하거나 액세스하여로드 (게으른 로딩이 활성화 된 경우) 게으른 : 경우에

var details = student.Details; 

또는 명시 적 로딩을 당신은 모른다 이 검색되는 것 게으른 로딩이 비활성화 방법 :

dbContext.Entry(student).Reference(s => s.Details).Load(); 

당신이 할되면, 그 질문의 코드

student.Details = null; 
dbContext.SaveChanges(); 

은 데이터베이스에서 기존 세부 정보 레코드를 삭제합니다.