簡體   English   中英

代碼首先導致所需關系是可選的?

[英]Code first causing required relation to be optional?

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我已經定義了關系,這些關系應該是必需的,這意味着Client和Product關系不能為null,Client和Inquiry也不能為null。

然而,客戶和查詢之間的關系被迫成為Code First的可選關系。 當我嘗試使它們成為必需時,EF不會生成數據庫。

有人能告訴我我的模型有什么問題導致EF不能在Client和Inruiry之間建立必要的關系嗎? 這是由於級聯刪除嗎? 當我讀到一些mssql在Client,Product和Inquiry之間只能有一個級聯刪除路徑時。 任何幫助解釋都會很好。

EF Code First默認情況下在生成的外鍵約束上將cascade delete設置為true。 而且因為你只能有一個級聯路徑,你會得到一個像這樣的異常:

“在表''查詢'中引入FOREIGN KEY約束'Inquiry_Retailer'可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。

在您的模型中,您有3個從客戶端到查詢的級聯路徑:

客戶 - 詢問零售商 - > 查詢
客戶 - 咨詢制造商 - > 查詢
客戶 - 產品 - > 產品 - 咨詢 - > 查詢

所以你需要設置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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM