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 шт):
Я не вижу у вас в коде создания связи 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.