【发布时间】:2021-02-17 09:32:43
【问题描述】:
伙计们,我正在尝试运行 dotnet ef database update 命令,但在执行它的过程中,它给了我一个异常:
Failed executing DbCommand (12ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [ProductSubCategory] (
[ProductId] int NOT NULL,
[SubCategoryId] int NOT NULL,
CONSTRAINT [PK_ProductSubCategory] PRIMARY KEY ([SubCategoryId], [ProductId]),
CONSTRAINT [FK_ProductSubCategory_Product_ProductId] FOREIGN KEY ([ProductId]) REFERENCES [Product] ([ProductId]) ON DELETE CASCADE,
CONSTRAINT [FK_ProductSubCategory_SubCategory_SubCategoryId] FOREIGN KEY ([SubCategoryId]) REFERENCES [SubCategory] ([SubCategoryId]) ON DELETE CASCADE
);
Microsoft.Data.SqlClient.SqlException (0x80131904): Introducing FOREIGN KEY constraint 'FK_ProductSubCategory_SubCategory_SubCategoryId' on table 'ProductSubCategory' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.
Introducing FOREIGN KEY constraint 'FK_ProductSubCategory_SubCategory_SubCategoryId' on table 'ProductSubCategory' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.
我在 ASP.NET CORE MVC 应用程序中使用 Sql Server 作为我的数据库提供程序和 Entity framework core 3.19。公平地说,我不确定是什么原因造成的,因为我之前没有遇到过这样的麻烦,一旦我在 all 依赖实体上添加了诸如 public int CategoryId { get; set; } 之类的外键属性(在一个到许多关系),例如产品,因为我之前忘记添加它们,现在我将使用它们来更新产品实体。我正在显示实体和流畅的 api 代码Product.cs强>
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public Category Category { get; set; }
public int CategoryId { get; set; } //It's one of the foreign keys properties added
public Brand Brand { get; set; }
public int BrandId { get; set; } //It's one of the foreign keys properties added
public string ImageName { get; set; }
public IEnumerable<ProductSubCategory> SubCategories { get; set; }
}
ProductSubCategory.cs
public class ProductSubCategory
{
public int ProductId { get; set; }
public Product Product { get; set; }
public int SubCategoryId { get; set; }
public SubCategory SubCategory { get; set; }
}
SubCategory.cs
public class SubCategory
{
public int SubCategoryId { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public Category Category { get; set; }
[JsonIgnore]
public IEnumerable<ProductSubCategory> ProductSubCategories { get; set; }
}
Category
public class Category
{
public int CategoryId { get; set; }
public string Name { get; set; }
public IEnumerable<Product> Products { get; set; }
public IEnumerable<SubCategory> SubCategories { get; set; }
}
DbContext.cs
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ProductSubCategory>()
.HasKey(psc => new {psc.SubCategoryId, psc.ProductId});
modelBuilder.Entity<ProductSubCategory>()
.HasOne(psc => psc.Product)
.WithMany(p => p.SubCategories)
.HasForeignKey(psc => psc.ProductId);
modelBuilder.Entity<ProductSubCategory>()
.HasOne(psc => psc.SubCategory)
.WithMany(sc => sc.ProductSubCategories)
.HasForeignKey(psc => psc.SubCategoryId);
}
我很确定我正确配置了关系。
我尝试过的事情:
- 删除迁移文件夹并创建一个新文件夹。
- 将 Ef Core nuget 包更新到最新版本
- 删除数据库,然后创建一个新的。
PD:我需要帮助,我没时间了,如果你想要实体项目的源代码及其各自的 Dbcontext,我可以给你,但正如我所说,它有 19 个实体类。
这是源代码:https://github.com/ToastedGuy2/Food-Town-issue
编辑: 真正的问题是如何删除每个外键中的 On Cascade On Delete?不管是一对多还是多对多关系。
【问题讨论】:
-
错误告诉您问题:“在表 'ProductSubCategory' 上引入 FOREIGN KEY 约束 'FK_ProductSubCategory_SubCategory_SubCategoryId' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION ,或修改其他 FOREIGN KEY 约束。"
-
哪一部分?错误很清楚,解决方案也很明确。
-
只搜索“循环或多级联路径”
-
好的,让我们开始吧,“可能导致循环或多级联路径”这句话有什么不妥之处?那么,在这之后,“Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraint.”的哪一部分。你不明白吗?哪些具体部分让您感到困惑?
-
类别和子类别有什么区别?为什么你在一个类中有 CategoryId 和 SubCategoryId。 Category 类在哪里?
标签: c# sql-server .net-core entity-framework-core dbcontext