2016-02-25 138 views
0

我試圖用實體框架開發ASP.net MVC應用程序,並且在過去大約8小時內,我試圖解決某些問題而沒有成功。我有3個型號,OverhourAccountingVacationOverhour是父模型,一旦我們創建了Overhour,我們可以創建一個AccountingVacation記錄一次。我們不需要創建一個,所以我們可以有一個Overhour而不需要AccountingVacation。重要的是,當我們刪除Overhour時,我們應該刪除AccountingsVacations(如果它們存在)。在實體框架中使用可選記錄級聯刪除

我先使用代碼,我試着用數據註解,但它似乎當你不能用可選模型做到這一點,所以我現在使用Fluent Api。下面是我使用關係的OverhourAccounting之間的事:

modelBuilder.Entity<Overhour>() 
.HasOptional<Accounting>(s => s.Accounting) 
.WithOptionalPrincipal() 
.WillCascadeOnDelete(true); 

即使我使用CodeFirst,我使用插件來創建用於測試的模型圖和模型看起來也沒關係(我猜):

Diagram(看來我不能直接包含在圖像)

按照我的理解,它「瀑布上End1Delete」說。因此,當我刪除Overhour時,會計記錄也應該被刪除,但它不起作用,它只是將其設置爲空。

另一件事是,我不知道哪一個是父母。我的意思是,我應該有一個Overhour模式是這樣的:

class Overhour { 
    ... 
    public int AccountingId { get; set; } 
    public virtual Accounting Accounting { get; set; } 
} 

或者是這樣的:

class Overhour { 
    ... 
    public virtual Accounting Accounting { get; set; } 
} 

也許我應該包括這個屬性會計模型?像這樣:

class Accounting { 
    ... 
    public virtual Overhour Overhour { get; set; } 
} 

也許我需要兩個都做?

我很困惑,有什麼想法?

感謝

回答

0

我能得到級聯可選配記錄刪除使用這個工作:

public class Overhour 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual Guid Id { get; set; } 
} 

public class Accounting 
{ 
    [ForeignKey("Overhour")] 
    public virtual Guid Id { get; set; } 

    public virtual Overhour Overhour { get; set; } 
} 

public class Vacation 
{ 
    [ForeignKey("Overhour")] 
    public virtual Guid Id { get; set; } 

    public virtual Overhour Overhour { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Accounting>() 
     .HasRequired(accounting => accounting.Overhour) 
     .WithOptional() 
     .WillCascadeOnDelete(true); 

    modelBuilder.Entity<Vacation>() 
     .HasRequired(vacation => vacation.Overhour) 
     .WithOptional() 
     .WillCascadeOnDelete(true); 
} 
+0

這裏是東西,會計並不需要有一個Overhour記錄。這也是可選的。所以當我嘗試使用你給的代碼時,我得到了一個錯誤,像'級聯外鍵'FK_dbo.Accountings_dbo.Overhours_AccountingId'不能被創建,其中引用列'Accountings.AccountingId'是一個標識列。 – Dolmakalem

+0

根據[this](https://msdn.microsoft.com/en-us/data/jj591620#CascadeDelete),如果外鍵字段爲空,那麼當主體被刪除時,該外鍵的外鍵字段將被設置爲空;該依賴關係不會被刪除。我不知道如何使外鍵字段不可爲空和可選。 – erli

+0

是的,我認爲我想要做的事是不可能的,因爲雙方都是可選的。我會只使用自定義代碼。謝謝。 – Dolmakalem

相關問題