gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:37:23 25 4
gpt4 key购买 nike

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

下面是我定义的一些类。它们之间的关系如下:客户和产品一对多,客户和查询一对多,产品和查询一对多。我在这里使用代码优先。现在使用 fluent api 我已经定义了关系,这些关系应该是必需的,这意味着 Client 和 Product 关系不能为 null,Client 和 Inquiry 也不能为 null。

然而,客户与查询之间的关系被迫成为代码优先的可选关系。当我尝试让它们成为必需时,EF 不会生成数据库。

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

最佳答案

默认情况下,EF Code First 在生成的外键约束上设置级联删除为真。因为你只能有一个级联路径,所以你会得到这样的异常:

"Introducing FOREIGN KEY constraint 'Inquiry_Retailer' on table 'Inquiries' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

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

客户 --InquiryRetailers--> Inquiry
客户 --InquiryManufacturers--> Inquiry
Client --Products--> Product --Inquiries--> Inquiry

因此您至少需要为两个 关系设置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);

关于c# - 代码首先导致所需的关系是可选的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8373050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com