EF Core не создается связь one to many

Раньше у меня в базе была такая логика: один субъект, у которого может быть много операторов. Я использовал вот такой метод Configure:

internal class OperatorConfiguration : BaseEntityConfiguration<Operator>
{
    public override void Configure( EntityTypeBuilder<Operator> builder )
    {
        base.Configure( builder );
        builder.HasIndex( p => new { p.Login, p.DeletionTime } ).IsUnique();

        builder.Property( p => p.Login ).IsRequired().HasMaxLength( 100 );

        builder.Property( p => p.Password ).IsRequired().HasMaxLength( 72 );

        builder.HasAlternateKey( p => p.SubjectId );
        builder.HasOne( p => p.Subject ).WithOne( p => p.Operator )
            .HasForeignKey<Operator>( p => p.SubjectId ).IsRequired();
    }
}

Сейчас логика немного поменялась. Теперь один субъект может иметь множество операторов. Я подумал, что достаточно будет удалить вот эти строки:

builder.HasAlternateKey( p => p.SubjectId );
builder.HasOne( p => p.Subject ).WithOne( p => p.Operator )
      .HasForeignKey<Operator>( p => p.SubjectId ).IsRequired();

Но, к сожалению, нет. Ef core все равно пытается создать связь. Команда 'add-migration' добавляет такую миграцию:

public partial class RemoveAlternateKeyFromOperator : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropUniqueConstraint(
                name: "AK_Operator_SubjectId",
                table: "Operator");

            migrationBuilder.DropIndex(
                name: "IX_Operator_Login",
                table: "Operator");

            migrationBuilder.CreateIndex(
                name: "IX_Operator_Login_DeletionTime",
                table: "Operator",
                columns: new[] { "Login", "DeletionTime" },
                unique: true);

            migrationBuilder.CreateIndex(
                name: "IX_Operator_SubjectId",
                table: "Operator",
                column: "SubjectId",
                unique: true);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropIndex(
                name: "IX_Operator_Login_DeletionTime",
                table: "Operator");

            migrationBuilder.DropIndex(
                name: "IX_Operator_SubjectId",
                table: "Operator");

            migrationBuilder.AddUniqueConstraint(
                name: "AK_Operator_SubjectId",
                table: "Operator",
                column: "SubjectId");

            migrationBuilder.CreateIndex(
                name: "IX_Operator_Login",
                table: "Operator",
                column: "Login",
                unique: true);
        }
    }

Обновление базы с такой миграцией, приводит к тому, что я не могу иметь в таблице Operator несколько одинаковых SubjectId.

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

public class Operator : BaseEntity
{
    public Operator()
    {
    }

    public Operator( string login, Guid subjectId ) : base()
    {
        Login = login;
        SubjectId = subjectId;
    }

    public Operator( Guid id, string login, Guid subjectId ) : base( id )
    {
        Login = login;
        SubjectId = subjectId;
    }

    public Operator( Guid id, string login, Subject subject ) : base( id )
    {
        Login = login;
        Subject = subject;
    }

    public Operator( Guid id ) : base( id )
    {
    }

    public string Login { get; protected set; }
    public string Password { get; protected set; }
    public bool IsActive { get; set; } 
    public Guid SubjectId { get; set; }
    public virtual Subject Subject { get; set; }
}

А модель Subject выглядит вот так:

public class Subject : BaseEntity
{
    public Subject() : base()
    {
    }

    public Subject( Guid id ) : base( id )
    {
    }

    public virtual Operator Operator { get; set; }

    public Guid? WorktimeScheduleId { get; set; }
    
    public virtual WorktimeSchedule WorktimeSchedule { get; set; }
    
    public JsonDocument Rules { get; set; }
}

Ответы (1 шт):

Автор решения: Alexander Petrov

Я не вижу у вас в коде создания связи one-to-many.

Вот связь one-to-one:

public class Operator : BaseEntity
{
    public Guid SubjectId { get; set; }
    public Subject Subject { get; set; }
}
public class Subject : BaseEntity
{
    public Operator Operator { get; set; }
}

Связь создастся автоматически даже без указания дополнительной конфигурации.

Вот связь one-to-many:

public class Operator : BaseEntity
{
    public Guid SubjectId { get; set; }
    public Subject Subject { get; set; }
}
public class Subject : BaseEntity
{
    public ICollection<Operator> Operators { get; set; }
}

Чтобы было many нужно использовать какую-либо коллекцию. В данном случае указан интерфейс ICollection.

→ Ссылка