[英]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.