2015-04-29 76 views
2

我有一個用戶類,其中每個用戶可以有多個地址。創建用戶和地址(1多)和訂單和地址(1-1)之間的關係

我也有一個訂單類,其中每個訂單可以只有一個地址。

我有下面的代碼,並得到級聯刪除錯誤,在此之前,我得到了外鍵約束問題,並已修復這些問題。

public class User : IdentityUser 
{ 
    public virtual ICollection<Purchase> Purchases { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
} 

public class Order 
{ 
    [Key, ForeignKey("User")] 
    public string OrderId { get; set; } 
    public virtual User User { get; set; } 

    [Required, ForeignKey("Address")] 
    public int AddressId { get; set; } 
    public virtual Address Address { get; set; } 

    public virtual ICollection<OrderItem> Items { get; set; } 
} 
public class Address 
{  
    public int Id { get; set; } 

    [Required] 
    public string UserId { get; set; } 
    public User User { get; set; } 
} 

我不確定什麼現在是錯誤的,我認爲級聯問題是我嘗試實現地址表1-1和1一對多的關係。

確切的錯誤是這樣的:

Introducing FOREIGN KEY constraint 
'FK_dbo.Purchases_dbo.AspNetUsers_UserId' on table 
'Orders' may cause cycles or multiple cascade paths. 
Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify 
other FOREIGN KEY constraints. 

在Visual Studio 2013程序包管理器控制檯執行該語句時,我得到這個錯誤。

'Update-Package -Force' 

編輯:

以下@erkaners建議我開始重新考慮這個結構之後。

「用戶」可以擁有任意數量的送貨地址。我們的一些用戶經常運送到多個地址,並且不應該重複輸入這些地址。

'訂單'是正在進行的訂單,客戶選擇他們以前的地址之一或輸入新地址當這個訂單被創建時。

然後我有一個'OrderHistory'的表格,它是完成的訂單。

現在我在想我實際上並沒有想要刪除一個地址,因爲那麼'OrderHistory'表將不能再引用它的地址。

相反,我認爲我應該添加一個布爾列來標記Active/Inactive地址並完全刪除級聯刪除。這是更好的行動方式嗎?

+0

使用繼承'訂單' – renakre

+0

繼承如何幫助順序?最終訂單歷史與訂單完全不同,有些物業不會轉移到歷史記錄,因爲它們只需要預購。 – rbuddicom

回答

3

這是因爲有兩個路徑可能導致刪除地址。使用流利的API你可以解決這個問題:

public class Order 
    { 
     public string OrderId { get; set; } 

     [Required, ForeignKey("User")] 
     public string UserId { get; set; } 
     public virtual User User { get; set; } 

     [Required, ForeignKey("Address")] 
     public int AddressId { get; set; } 
     public virtual Address Address { get; set; } 

     public virtual ICollection<OrderItem> Items { get; set; } 
    } 

    public class Address 
    {  
     public int AddressId { get; set; } 

     [ForeignKey("User")] 
     public string UserId { get; set; } 
     public User User { get; set; } 

     [ForeignKey("Order")] 
     public string OrderId { get; set; } 
     public Order Order { get; set; } 
    } 


    modelBuilder.Entity<User>() 
       .HasMany(u => u.Addresses) 
       .WithRequired(a => a.User) 
       .HasForeignKey(a => a.UserId); 
       .WillCascadeOnDelete(false); 
+0

乾杯,我是否需要刪除任何數據註釋或將流利的API覆蓋它? – rbuddicom

+0

@Hellfire不用擔心其他部分,這種關係不會流利的API,但我們在這裏需要''.WillCascadeOnDelete(false);' – renakre

+0

好酷,也應該是Entity ?只是想知道爲什麼用戶有一個外鍵給用戶;) \t 如果我刪除一個用戶我想級聯,但如果我刪除一個訂單,我不想要它 – rbuddicom