Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码优先导致必需关系为可选关系?_C#_Ef Code First_Poco_Cascading Deletes_Code First - Fatal编程技术网

C# 代码优先导致必需关系为可选关系?

C# 代码优先导致必需关系为可选关系?,c#,ef-code-first,poco,cascading-deletes,code-first,C#,Ef Code First,Poco,Cascading Deletes,Code First,下面是我定义的一些类。它们的关系如下:客户和产品是一对多,客户和询价是一对多,产品和询价是一对多。我在这里首先使用代码。现在我使用fluentapi定义了关系,这些关系应该是必需的,这意味着客户与产品的关系不能为null,客户与查询的关系也不能为null 然而,客户机和查询之间的关系被强制为可选关系,代码优先。当我试图使它们成为必需时,EF不会生成数据库 有人能告诉我我的模型有什么问题吗?它导致EF无法在客户和InRury之间建立所需的关系?这是由于级联删除吗?正如我所读到的,mssql在客户端

下面是我定义的一些类。它们的关系如下:客户和产品是一对多,客户和询价是一对多,产品和询价是一对多。我在这里首先使用代码。现在我使用fluentapi定义了关系,这些关系应该是必需的,这意味着客户与产品的关系不能为null,客户与查询的关系也不能为null

然而,客户机和查询之间的关系被强制为可选关系,代码优先。当我试图使它们成为必需时,EF不会生成数据库


有人能告诉我我的模型有什么问题吗?它导致EF无法在客户和InRury之间建立所需的关系?这是由于级联删除吗?正如我所读到的,mssql在客户端、产品和查询之间只能有一个级联删除路径。任何帮助解释都很好。

EF代码首先在默认情况下将生成的外键约束上的级联删除设置为true。由于只能有一个级联路径,因此会出现如下异常:

“在表上引入外键约束“查询\零售商” “查询”可能导致循环或多个级联路径。请在上指定 删除无操作或更新无操作,或修改其他外键 限制

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

客户--查询零售商-->查询
客户--查询制造商-->查询
客户--产品-->产品--查询-->查询

因此,您需要至少为两个关系(取决于您的需求)设置
WillCascadeOnDelete(false)

modelBuilder.Entity().HasRequired(i=>i.Product)
.有许多(p=>p.Inquiries);
modelBuilder.Entity().HasRequired(i=>i.Manufacturer)
.有许多(p=>p.InquiryManufacturers)
.HasForeignKey(p=>p.ManufacturerID).WillCascadeOnDelete(false);
modelBuilder.Entity().HasRequired(i=>i.Retailer)
.有许多(p=>p.InquiryRetailers)
.HasForeignKey(p=>p.RetailerID).WillCascadeOnDelete(false);

您是否有任何错误?您所说的“它被强制为可选错误”是什么意思“?没有错误,只是数据库没有生成,但如果我将RetailerID和ManufacturerID设置为null,将Fluent Api设置为可选,则会生成数据库。请发布完整的映射配置:与讨论的3个实体相关的所有内容。”。提供足够的信息再现您的情况。还有,你的目标是哪个db引擎?这就是一切,我从模型中取出了我能得到的一切,在得到上面的代码后,我得到了错误,但我得到了我的答案。谢谢,很抱歉回复太晚,但我很忙,在阅读了一些其他博客和书籍后,我发现默认的级联删除是问题所在。
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; }
}
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);
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);