2012-07-09 133 views
0

我要通過代碼首先定義如下表:爲什麼EF級聯刪除不能在0到1的關係上工作?

public class Action 
{ 
    public int ActionId { get; set; } 

    public int? EmailMessageId { get; set; } 
    public virtual EmailMessage EmailMessage { get; set; } 
} 

public class EmailMessage 
{ 
    public int EmailMessageId { get; set; } 

    public string Content { get;set; 
} 

當與相應的EmailMessage創建一個動作,刪除動作不會刪除EmailMessage的條目。看來EF只會在一對多關係上創建級聯刪除。在這種情況下,關係是0或1關係,默認情況下沒有設置級聯刪除。

我加入了流暢的配置:

modelBuilder 
    .Entity<Action>() 
    .HasOptional(x =>x.EmailMessage) 
    .WithMany() 
    .HasForeignKey(x=>x.EmailMessageId) 
    .WillCascadeOnDelete(true); 

這似乎是正確設置在觀看Management Studio中的架構時級聯刪除。但是當我從數據庫中手動刪除行時,EmailMessage中的行仍然存在。

我究竟在做什麼錯在這裏? 我以爲我可能會在配置中使用'WithOptionalDependent()'時出現問題。但是當我查看模式時,當我在表中已經有EmailMessageId時,它已經引入了「EmailMessage_EmailMessageId」。

任何人都可以建議這裏有什麼問題嗎?

回答

0

級聯刪除的目的是去除孩子圍繞刪除,而不是相反。在這種情況下,Action是與EmailMessage父項的外鍵關聯的子項。因此,刪除操作不會影響EmailMessage,但刪除EmailMessage應該級聯刪除操作。

+0

好的。從概念上講,它感覺就像EmailMessage是一個孩子,因爲導航屬性是從Action指向EmailMessage。如果這個關係是0-many,而EmailMessage是一個Action內部的集合,那麼這會不會是一個孩子? – jaffa 2012-07-09 15:32:53

+0

正確,但'EmailMessage'會有一個'ActionId'字段,其外鍵指向'Action'。最後,數據庫不知道你如何配置你的POCO模型,它只知道主鍵/外鍵關係。 – PinnyM 2012-07-09 16:23:54

0

我剛剛意識到,當使用「contextName.Entry(parentStudySession).State = System.Data.Entity.EntityState.Deleted;」刪除一些父母與少數兒童..我交談EF 6.3,EF不會刪除我們的孩子,甚至沒有刪除父母本身,即使我們有刪除約束層疊。相反,它提供了一個錯誤「操作失敗:由於一個或多個外鍵屬性是不可空的,所以無法更改關係。對關係進行更改時,相關的外鍵屬性設置爲如果外鍵不...「

而是,當我使用」contextName.StudySession.Remove(parentStudySession);「 , EF 6.3成功刪除了PARENT和CHILDREN ...我在刪除約束條件下級聯。 T.Adakoğlu