#c# #entity-framework-core
#c# #сущность-структура-ядро
Вопрос:
Этот вопрос касается ядра EF.
Я получаю эту ошибку, когда я «dotnet ef обновляю базу данных»:
Introducing FOREIGN KEY constraint 'FK_PupilTests_Tests_TestId' on table 'PupilTests' 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.
Я понимаю, почему я получаю эту ошибку, и я попытался устранить ошибку, правильно настроив DeleteBehavior, но это просто не работает.
Так что же не так с моей свободной конфигурацией?
Свободная настройка:
builder.Entity<Test>().HasMany<PupilTest>(x => x.PupilsTests).WithOne(p => p.Test).HasForeignKey(p => p.TestId).OnDelete(DeleteBehavior.Restrict);
builder.Entity<Pupil>().HasMany<PupilTest>(x => x.PupilsTests).WithOne(p => p.Pupil).HasForeignKey(p => p.PupilId).OnDelete(DeleteBehavior.Restrict);
Модель
public class Pupil
{
public Pupil()
{
PupilsTests = new HashSet<PupilTest>();
}
public int Id { get; set; }
public ISet<PupilTest> PupilsTests { get; set; }
}
public class PupilTest
{
public int PupilId { get; set; }
public int TestId { get; set; }
public decimal Scores { get; set; }
public Pupil Pupil { get; set; }
public Test Test { get; set; }
}
public class Test
{
public Test()
{
PupilsTests = new HashSet<PupilTest>();
}
public int Id { get; set; }
public ISet<PupilTest> PupilsTests { get; set; }
}
Миграция
public partial class Init11 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_PupilTests_Pupils_PupilId",
table: "PupilTests");
migrationBuilder.AddForeignKey(
name: "FK_PupilTests_Pupils_PupilId",
table: "PupilTests",
column: "PupilId",
principalTable: "Pupils",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_PupilTests_Pupils_PupilId",
table: "PupilTests");
migrationBuilder.AddForeignKey(
name: "FK_PupilTests_Pupils_PupilId",
table: "PupilTests",
column: "PupilId",
principalTable: "Pupils",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
}
Комментарии:
1. Как выглядит сгенерированная миграция?
2. Обновление с помощью миграции!
3. Возможно, вам следовало сначала удалить предыдущую миграцию, потому что она не работает с другим FK (
'FK_PupilTests_Tests_TestId
), который не является частью этой миграции. В противном случае свободная конфигурация в порядке и работает корректно в чистой среде (т. Е. миграция, которая создает 3 таблицы и FK)4. ах, это было оно. Удалите папку database migrations и начните с нуля. Хотя я и делал это раньше, но тогда мое свободное владение было немного другим. Спасибо за тестирование в clean env!