Entity framework core 外键约束可能会导致循环或多个级联路径,但仅在一个项目中

Entity framework core 外键约束可能会导致循环或多个级联路径,但仅在一个项目中,entity-framework-core,Entity Framework Core,我已经讨论了关于SO的其他问题,但没有一个对我的情况有帮助,所以请不要将其标记为重复。我从文档中下载并运行了该方法,以获得一个多对多链接表。示例项目已完成 public class Book { [Key] public int BookId { get; set; } public string Title { get; set; } public string Author { get; set; } public ICollection<Boo

我已经讨论了关于SO的其他问题,但没有一个对我的情况有帮助,所以请不要将其标记为重复。我从文档中下载并运行了该方法,以获得一个多对多链接表。示例项目已完成

public class Book {
    [Key]
    public int BookId { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public ICollection<BookCategory> BookCategories { get; set; }
}
public class Category {
    [Key]
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public ICollection<BookCategory> BookCategories { get; set; }
}
public class BookCategory {
    public int BookId { get; set; }
    public Book Book { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}
将代码复制到我的项目中并添加迁移将创建相同的迁移文件。但是,当我试图更新数据库时,我得到了错误

Introducing FOREIGN KEY constraint 'FK_BookCategory_Category_CategoryID' on table 'BookCategory' 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.
交换两个
表。ForeignKey(
语句)意味着错误指向
FK\u BookCategory\u Book\u BookID
,并且只有其中一个才成功更新数据库


你知道为什么迁移可以在一个项目中工作,而不能在另一个项目中工作吗?

protectedoverride void onmodellcreating(ModelBuilder-ModelBuilder){
I已删除

.HasForeignKey(bc => bc.BookId);
并将其替换为

.OnDelete(DeleteBehavior.Restrict);
所以看起来是这样的

  modelBuilder.Entity<BookCategory>()
        .HasOne(bc => bc.Book)
        .WithMany(b => b.BookCategories)
        .OnDelete(DeleteBehavior.Restrict);
    modelBuilder.Entity<BookCategory>()
        .HasOne(bc => bc.Category)
        .WithMany(c => c.BookCategories)
        .OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity()
.HasOne(bc=>bc.Book)
.WithMany(b=>b.BookCategories)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity()
.HasOne(bc=>bc.Category)
.WithMany(c=>c.BookCategories)
.OnDelete(DeleteBehavior.Restrict);

这将删除级联部分,以便一切正常。我在SQL Management Studio和代码中测试了从每个表中删除记录,没有一个代码级联任何删除,这表示我很高兴。

受保护的重写模型创建无效(ModelBuilder ModelBuilder){
中,我删除了

.HasForeignKey(bc => bc.BookId);
并将其替换为

.OnDelete(DeleteBehavior.Restrict);
所以看起来是这样的

  modelBuilder.Entity<BookCategory>()
        .HasOne(bc => bc.Book)
        .WithMany(b => b.BookCategories)
        .OnDelete(DeleteBehavior.Restrict);
    modelBuilder.Entity<BookCategory>()
        .HasOne(bc => bc.Category)
        .WithMany(c => c.BookCategories)
        .OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity()
.HasOne(bc=>bc.Book)
.WithMany(b=>b.BookCategories)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity()
.HasOne(bc=>bc.Category)
.WithMany(c=>c.BookCategories)
.OnDelete(DeleteBehavior.Restrict);

这将删除级联部分,以便一切正常。我在SQL Management Studio和代码中测试了从每个表中删除记录,没有任何代码级联任何删除,这表示我很高兴。

您是否尝试过生成SQL脚本并对数据库运行它?生成的SQL脚本会创建导致错误的键ame问题。这意味着我不能使用EF进行迁移。我当前项目中有多个多对多声明与此完全相同,它们都可以正常工作。请尝试使用主键和OnDelete行为显式显示。您的意思是添加
[key]
到BookCategory?如果是这样,我尝试过,但没有任何影响。有时当我生成迁移时
FK\u BookCategory\u Category\u CategoryID
具有
referentialition.Cascade
和有时
referentialition.Restrict
。如果它生成为
referentialication.Restrict
,我将其更改为
cascase
有时运行,有时不运行。您是否尝试过生成sql脚本并对数据库运行它?生成的sql脚本会创建导致相同问题的密钥。这意味着我无法使用EF进行迁移。我在当前项目中有多个多对多脚本,它们都是这样声明的工作正常。尝试显式使用主键和OnDelete行为。您的意思是添加
[key]
到BookCategory?如果是这样,我尝试过,但没有任何影响。有时当我生成迁移时
FK\u BookCategory\u Category\u CategoryID
具有
referentialition.Cascade
和有时
referentialition.Restrict
。如果它生成为
referentialication.Restrict
,我将其更改为
cascase
有时运行,有时不运行。