2011-12-04 19 views
7
public class Client 
{ 
    public Int32 ClientID { get; set; } 

    public virtual ICollection<Inquiry> InquiryManufacturers { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<Inquiry> InquiryRetailers { get; set; } 
} 

public class Product 
{ 
    public Int32 ProductID { get; set; } 

    public Int32 ClientID { get; set; } 
    public virtual Client Client { get; set; } 

    public virtual ICollection<Inquiry> Inquiries { get; set; } 
} 

public class Inquiry 
{ 
    public Int32 InquiryID { get; set; } 

    public Int32 ProductID { get; set; } 
    public Int32 ManufacturerID { get; set; } 
    public Int32 RetailerID { get; set; } 
    public virtual Product Product { get; set; } 
    public virtual Client Manufacturer { get; set; } 
    public virtual Client Retailer { get; set; } 
} 

的流暢API是第一個導致所需關係的代碼是可選的嗎?

HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID); 
HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID); 

因此,這裏是我已經定義了一些類。他們有如下關係:客戶&產品有一對多,客戶&查詢有一對多和產品&查詢有一對多。我在這裏使用Code First。現在使用流利的API我已經定義了這些關係,這些關係應該是必需的,這意味着客戶端&產品關係不能爲空,以及客戶端和查詢也不能爲空。

然而,客戶端&查詢的關係被迫爲Code First的可選項。當我試圖讓他們需要EF不會生成數據庫。

有人能告訴我我的模型有什麼問題,它導致EF無法在客戶端& Inruiry之間創建所需的關係?這是由於級聯刪除?在我讀了一些其中mssql只能在客戶端,產品和查詢之間有一個級聯刪除路徑的地方。任何幫助解釋會很好。

+0

您是否收到任何錯誤? 「它被迫成爲一個可選的」是什麼意思? – CDeutsch

+0

沒有錯誤,只是沒有生成數據庫,但如果我使零售商ID和ManufacturerID爲null 和Fluent Api爲HasOptional,那麼數據庫就會生​​成。 – user781310

+0

請發佈完整的映射配置:與正在討論的3個實體相關的所有內容。提供足夠的信息來重現您的情況。另外,你的目標是哪個數據庫引擎? –

回答

2

EF代碼默認情況下,首先設置級聯刪除生成的外鍵約束上的真值。因爲你只能有一個級聯路徑,你會得到一個例外是這樣的:

「引進國外KEY約束‘Inquiry_Retailer’對錶 ‘查詢’可能會導致循環或多重級聯路徑指定ON DELETE NO行動或UPDATE NO ACTION,或修改其他FOREIGN KEY約束

在模型中你有3點梯級的路徑從客戶詢盤:

客戶 --InquiryRetailers - >詢問
客戶 --InquiryManufacturers - >詢問
客戶 - 產品 - >產品 --Inquiries - >詢問

所以你至少需要設置WillCascadeOnDelete(false)兩個關係(根據你的要求):

modelBuilder.Entity<Inquiry>().HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID).WillCascadeOnDelete(false); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID).WillCascadeOnDelete(false); 
+0

謝謝,對於遲到的回覆感到抱歉,但我很忙,讀了一些其他博客和書後,我發現默認級聯刪除是問題。 – user781310

相關問題