2017-09-20 21 views
2

如何設置與EF 6.x的1 : 0..1關係,以便將navigation屬性設置爲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);''''''''據我所知,當您將一個實體設置爲null時,什麼也不做。 –

回答

2

的關係設置是正確的,應該產生期望的行爲(我建議,爲了增加WillCascadeOnDelete()允許級聯刪除其通過默認關閉一對一關係,但不影響有問題的行爲)

但是,必須加載Details屬性之後才能將其設置爲null以便通過上下文檢測爲更改在期間更改跟蹤器並從數據庫中刪除電話。

您可以通過多種方式來實現。例如,實體檢索過程中急於加載:

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(); 

將從數據庫中刪除現有的詳細記錄。