Entity Framework Core свободно использует API One-To-Many и One-To-One создает дублированный внешний ключ

Я изменяю свой проект ASP.NET MVC на ASP.NET Core MVC с Entity Framework Core и Fluent API. Когда я пытаюсь настроить отношение один-к-одному и один-ко-многим, он генерирует дубликаты столбцов внешнего ключа в зависимой таблице.

Например: у меня есть это в моем контексте OnModelCreating метод:

builder.Entity<Session>()
       .HasKey(s=>s.Id);
builder.Entity<Session>()
       .Property(s=>s.CourseId)
       .IsRequired();
builder.Entity<Session>()
       .HasOne<Course>()
       .WithMany(c => c.Sessions)
       .HasForeignKey(s=>s.CourseId)
       .IsRequired();

Модель сеанса выглядит так:

public class Session
{
    public int Id { get; set; }

    // foreign key 
    public int CourseId { get; set; }

    // navigation properties
    public virtual Course Course { get; set; }
}

Модель курса выглядит так:

public class Course
{
    public int Id { get; set; }

    // Navigation properties
    public ICollection<Session> Sessions { get; set; }
}

Вместо того, чтобы вернуть это в процессе миграции:

modelBuilder.Entity("Blackboard.Models.DomainModels.Session", b =>
    {
        b.Property<int>("Id")
            .ValueGeneratedOnAdd();

        b.Property<int>("CourseId");

        b.HasKey("Id");

        b.HasIndex("CourseId");

        b.ToTable("Sessions");
   });

Я получаю это:

 modelBuilder.Entity("Blackboard.Models.DomainModels.Session", b =>
    {
        b.Property<int>("Id")
            .ValueGeneratedOnAdd();

        b.Property<int>("CourseId");

        b.Property<int?>("CourseId1");

        b.HasKey("Id");

        b.HasIndex("CourseId");

        b.HasIndex("CourseId1");

        b.ToTable("Sessions");
   });

Так что, хотя я положил .IsRequired(); для отношений отношения кажутся необязательными и необязательными CourseId1 добавлен в таблицу.

Приложение разработано на Mac OSX с Visual Studio для Mac.

Я настраивал это так долго, я нашел что-то только для Entity Framework вместо Entity Framework Core. Они два не настроены одинаково. Может кто-то помочь мне, пожалуйста?

Спасибо.

1 ответ

Я нашел исправление. Я изменил контекст, чтобы:

builder.Entity<Session>()
   .HasOne(s=>s.Course)
   .WithMany(c => c.Sessions)
   .HasForeignKey(s=>s.CourseId)
   .IsRequired();

Я помню, где-то говорил, что если есть только одно свойство навигации, то .HasOne<Type>()(параметры не переданы) могут быть использованы. Очевидно, это не работает. Поэтому всегда используйте лямбда-параметр в .HasOne,