Ограничение внешнего ключа может вызвать циклы или несколько каскадных путей, но только в одном проекте - PullRequest
1 голос
/ 14 июня 2019

Я рассмотрел другие вопросы по 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; }
}

с

  modelBuilder.Entity<BookCategory>()
        .HasKey(bc => new { bc.BookId, bc.CategoryId });
    modelBuilder.Entity<BookCategory>()
        .HasOne(bc => bc.Book)
        .WithMany(b => b.BookCategories)
        .HasForeignKey(bc => bc.BookId);
    modelBuilder.Entity<BookCategory>()
        .HasOne(bc => bc.Category)
        .WithMany(c => c.BookCategories)
        .HasForeignKey(bc => bc.CategoryId);

в OnModelCreating.Это прекрасно работает и создает правильный файл миграции, который отлично работает и выглядит следующим образом

table.ForeignKey(
     table.ForeignKey(
    name: "FK_BookCategory_Book_BookID",
    column: x => x.BookID,
    principalTable: "Book",
    principalColumn: "BookID",
    onDelete: ReferentialAction.Cascade);
table.ForeignKey(
    name: "FK_BookCategory_Category_CategoryID",
    column: x => x.CategoryID,
    principalTable: "Category",
    principalColumn: "CategoryID",
    onDelete: ReferentialAction.Restrict);

Копирование кода в мой проект и добавление миграции создает тот же файл миграции.Но когда я пытаюсь обновить базу данных, я получаю сообщение об ошибке

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.

Замена двух операторов table.ForeignKey( означает, что ошибка относится к FK_BookCategory_Book_BookID, и только при наличии одного из них база данных обновляется успешно.,

Есть идеи, почему миграция работает в одном проекте, а не в другом?

1 Ответ

0 голосов
/ 18 июня 2019

В protected override void OnModelCreating(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);

Это удаляет каскадную часть, поэтому все работает. Я протестировал удаление записей из каждой таблицы в SQL Management Studio и в коде, и ни один из кодов не каскадно удаляет, что означает, что я счастлив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...