use*_*310 7 c# poco code-first cascading-deletes ef-code-first
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; }
}
Run Code Online (Sandbox Code Playgroud)
流利的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);
Run Code Online (Sandbox Code Playgroud)
所以这里有一些我定义的类.他们的关系如下:客户和产品有一对多,客户和查询有一对多,产品和查询有一对多.我在这里使用Code First.现在使用流畅的api我已经定义了关系,这些关系应该是必需的,这意味着Client和Product关系不能为null,Client和Inquiry也不能为null.
然而,客户和查询之间的关系被迫成为Code First的可选关系.当我尝试使它们成为必需时,EF不会生成数据库.
有人能告诉我我的模型有什么问题导致EF不能在Client和Inruiry之间建立必要的关系吗?这是由于级联删除吗?当我读到一些mssql在Client,Product和Inquiry之间只能有一个级联删除路径时.任何帮助解释都会很好.
默认情况下,EF Code First 在生成的外键约束上设置级联删除 true。因为你只能有一个级联路径,所以你会得到一个异常,如下所示:
“在表“Inquiries”上引入 FOREIGN KEY 约束“Inquiry_Retailer”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON 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);
Run Code Online (Sandbox Code Playgroud)