Пропуск навигации не имеет определенного внешнего ключа

#c# #macos #entity-framework-core #many-to-many #ef-core-5.0

#c# #macos #entity-framework-core #многие-ко-многим #ef-core-5.0

Вопрос:

Контекст

Я следую примерам нового моделирования отношений «Многие ко многим» в Entity Framework Core, на который ссылается здесь:

https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api,fluent-api-simple-key,simple-key#many-to-many

и командой, создающей его здесь (разверните сообщение от 23 июля 2020 года): https://github.com/dotnet/efcore/issues/19549

Я сделал это с новым проектом .NET Web API — единственным изменением является то, что в моей модели я использую объекты Staff и Team, а не объекты Post и Tag в примере.

Моя настройка

  • macOS 10.15.7 (Catalina)
  • .NET Framework 5.0.101
  • Версия EF 5.0.1

Проблема

Когда я запускаю миграцию, EF создает таблицу поиска в сгенерированном коде SQL, как описано в документации, даже если объект поиска не определен. Это здорово.

Однако после того, как я применяю изменения SQL и запускаю приложение, при доступе к конечной точке API я получаю сообщение об ошибке:

The skip navigation 'Staff.Teams' has no foreign key defined.

Меня это смущает, поскольку в примерах нет внешних ключей, определенных в их моделях.

Я кое-что осмотрел, но так и не смог найти похожую проблему.

Интересно, может ли это быть проблемой.СЕТЬ на macOS.

Спасибо.

Ответ №1:

Лучше поделиться своей моделью и конфигурацией, если она существует. но вообще, вы можете установить отношение «многие ко многим» в ef 5 по соглашению (без настройки). вам просто нужно установить Collection в каждой сущности, и ef автоматически создаст третью таблицу для этого отношения.
потому что у вас есть not defined foreign key , я думаю, вы установили конфигурацию. Я могу только поделиться образцом, надеюсь, это поможет вам.

 // MODEL
namespace EFConfiguration.Core.Domain.Relations
{
    public class Course
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Tag> Tags { get; set; }
    }

    public class Tag
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Course> Courses { get; set; }
    }

    public class CourseTag
    {
        public int CourseId { get; set; }
        public int TagId { get; set; }
        public Course Courses { get; set; }
        public Tag Tag { get; set; }
    }
}
 

и конфигурация:

 // CONFIG
public class CourseConfig : IEntityTypeConfiguration<Course>
{
    public void Configure(EntityTypeBuilder<Course> builder)
    {
        builder.HasMany(x => x.Tags).WithMany(x => x.Courses)
            .UsingEntity<CourseTag>(
            r => r.HasOne(x => x.Tag).WithMany().HasForeignKey(x => x.TagId),
            l => l.HasOne(x => x.Courses).WithMany().HasForeignKey(x => x.CourseId)); 
    }
}