代码首先导致所需关系是可选的?

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之间只能有一个级联删除路径时.任何帮助解释都会很好.

nem*_*esv 2

默认情况下,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)