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

时间:2011-12-04 03:31:38

标签: c# ef-code-first poco cascading-deletes 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; }
}

Fluent 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);

所以这里有一些我定义的类。他们的关系如下:客户&amp;产品有一对多,Client&amp;询问有一对多和产品&amp;询问有一对多。我在这里使用Code First。现在使用流畅的api我已经定义了这些关系,这些关系应该是必需的,这意味着Client&amp;产品关系不能为空,客户端和查询也不能为空。

然而,客户与客户之间的关系;询问被迫成为Code First的可选项。当我尝试使它们成为必需时,EF不会生成数据库。

有人能告诉我我的模型有什么问题导致EF无法在客户端和客户之间建立必要的关系。 Inruiry?这是由于级联删除吗?当我读到一些mssql在Client,Product和Inquiry之间只能有一个级联删除路径时。任何帮助解释都会很好。

1 个答案:

答案 0 :(得分:2)

EF Code First默认情况下在生成的外键约束上设置cascade delete true。而且因为你只能有一个级联路径,你会得到一个像这样的例外:

  

“在表格上引入FOREIGN KEY约束'Inquiry_Retailer'   “查询”可能导致循环或多个级联路径。指定ON   DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY   约束

在您的模型中,您有3个从客户端到查询的级联路径:

客户 - The InquiryRetailers - &gt; <强>询问
客户 - 询问制造商 - &gt; <强>询问
客户 - 产品 - &gt; 产品 - 查询 - &gt; <强>询问

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