2016-02-24 101 views
0

我想構建一個ASP.net MVC應用程序。我無法與數據註釋建立某種關係。實體框架中的多個表的可選關係ASP.net MVC

我有3個表格,​​,AccountingsVacations。每Overhour記錄可以有1 AccountingVacation記錄,但它是可選的。所以,它不需要有一個。這裏是我的Overhour型號:

public class Overhour 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int OverhourId { get; set; } 

    .... 

    public int? AccountingId { get; set; } 
    public virtual Accounting Accounting { get; set; } 

    public int? VacationId { get; set; } 
    public virtual Vacation Vacation { get; set; } 
} 

我想要當我刪除我Overhour記錄都VacationAccounting記錄中刪除(如果有的話)。當我像這樣使用它時,級聯刪除被禁用。

我嘗試這樣做:

public class Overhour 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int OverhourId { get; set; } 

    .... 

    public virtual Accounting Accounting { get; set; } 

    public virtual Vacation Vacation { get; set; } 
} 

級聯刪除的作品,但實體框架創建像「Accounting_AccountingId」領域,也是它成爲必需。這些不應該被要求。

最後一件事我想是這樣的:

public class Overhour 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int OverhourId { get; set; } 

    .... 

    public int AccountingId { get; set; } 
    public virtual Accounting Accounting { get; set; } 

    public int VacationId { get; set; } 
    public virtual Vacation Vacation { get; set; } 
} 

但這次它給了我這樣的錯誤:

上表XXX引進國外KEY XXX約束可能會導致循環或多重級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束條件

我很困惑,我做錯了什麼?

謝謝

回答

0

DELETE CASCADE不能像那樣工作。如果刪除Overhour,則不會刪除任何內容。它的工作方向相反。如果Accounting是必需的依賴項,並且您刪除與Overhour連接的Accounting實例,則還應該刪除Overhour。如果外鍵可以爲空,那麼不會發生這種情況,因爲它將被設置爲DELETE SET NULL。不過,無論哪種方式,刪除Overhour都不會對AccountingVacation實例產生任何影響。

UPDATE

創建一個對一個,它似乎像你所需要的,在這種情況下比較容易,因爲關係的一側是可選的。所有你需要的是:

public class Overhour 
{ 
    ... 

    public int? AccountingId { get; set; } // optional 
    public virtual Accounting Accounting { get; set; } 
} 

public class Accounting 
{ 
    ... 

    public int OverhourId { get; set; } // required 
    public virtual Overhour Overhour { get; set; } 
} 

就這樣,刪除Overhour將級聯刪除相關Accounting爲好,因爲它依賴於Overhour

當需要雙方的關係時,情況纔會變得複雜。然後,您必須使用流暢配置將一個設置爲主體,將一個設置爲從屬體,因爲EF無法在此時自行做出此決定。

+0

其實級聯刪除在我的第二個例子中工作。我很困惑。那麼,我應該在我的情況下做什麼?我應該自己刪除相關記錄嗎?因爲當我刪除超時記錄時,我需要刪除會計記錄和假期記錄。 – Dolmakalem

+0

嗯,問題在於你如何對待他們。默認情況下,這將創建一對多,即「Overhour」具有一個「Accounting」,而「Accounting」具有許多「Overhour」。這就是爲什麼它不會在這種情況下刪除「會計」,因爲它可能仍然在這個「Overhour」實例之外有效使用。如果你真的想把'Accounting'綁定到特定的'Overhour'實例,那麼你的關係應該是一對一的。 –

+0

我很迷茫,我想我需要閱讀更多關於Fluent Api的東西。 – Dolmakalem