MS SQL Сервер с EF Core «Введение ограничения FOREIGN KEY может привести к циклам или нескольким каскадным путям» с помощью Delete Behavior SetNull - PullRequest
0 голосов
/ 14 марта 2020

Я действительно думал, что понял ограничения поведения при удалении EF Core, относящиеся к серверу MS SQL, но, очевидно, я не знаю: - (

Представляем внешний ключ с поведением удаления "set null " приводит к следующему исключению при обновлении базы данных:

ALTER TABLE [AppointmentParticipations] ADD CONSTRAINT [FK_AppointmentParticipations_SelectValueMappings_ResultId] FOREIGN KEY ([ResultId [Selecting] I]] REFERENMES ON DELETE SET NULL; | url: | action: не удалось выполнить команду DbCommand (17 мс) [Parameters = [], CommandType = 'Text', CommandTimeout = '30 '] ALTER TABLE [AppointmentParticipations] ADD CONSTRAINT [FK_AppointmentParticipations_SelectValultId_Imp_IULTID_apps_Tell_Dext_apps_Tell_apps_Tell_apps_Tell_apps_Tell_apps_Tell_apps_Tell_apps_Tell_apps_Tell_app_Примечания_Примечания_приложения) ]) ССЫЛКИ [SelectValueMappings] ([Id]) ON DELETE SET NULL; Microsoft.Data.SqlClient.SqlException (0x80131904): введение ограничения FOREIGN KEY 'FK_AppointmentParticipations_SelectValueMappings_Resultations Appart причиной файлы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Смотрите предыдущие ошибки. в Microsoft.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, действие 1 wrapCloseInAction) at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) в Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObjectConignSignSlayCallSynClaySynClocksLockLockLoneLockLoneLockLoneLockLoneLocker). .TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, булева & dataReady) при Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds (String имяМетода, булева isAsyn c, Int32 тайм-аута, булева asyncWrite) в Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (TaskCompletionSource 1 completion, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String methodName) at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary 2 parameterValues) в Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery (IEnumerable.1 (Строка targetMigration) в Microso ft.EntityFrameworkCore.Design.Internal. <.ctor> b__0 () в Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute (действие action) ClientConnectionId: 40c35c1b-5be2-4cd c -957d-2e9ade19aceb Номер ошибки: 1785, состояние: 0, класс: 16 Представление Ограничение FOREIGN KEY «FK_AppointmentParticipations_SelectValueMappings_ResultId» в таблице «AppointmentParticipations» может вызывать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. См. Предыдущие ошибки.

Соответствующий класс:

public class AppointmentParticipation : BaseEntity
{
    public Guid PersonId { get; private set; }
    public virtual Person Person { get; private set; }
    public Guid AppointmentId { get; private set; }
    public virtual Appointment Appointment { get; private set; }
    public Guid? ResultId { get; private set; }
    public virtual SelectValueMapping Result { get; private set; }
    public Guid? PredictionId { get; private set; }
    public virtual SelectValueMapping Prediction { get; private set; }
}

Конфигурация типа сущности:

 public class AppointmentParticipationConfiguration : IEntityTypeConfiguration<AppointmentParticipation>
   {
        public void Configure(EntityTypeBuilder<AppointmentParticipation> builder)
        {
            builder
                .HasOne(e => e.Person)
                .WithMany(p => p.AppointmentParticipations)
                .HasForeignKey(e => e.PersonId)
                .OnDelete(DeleteBehavior.Cascade);

            builder
                .HasOne(e => e.Appointment)
                .WithMany(a => a.AppointmentParticipations)
                .HasForeignKey(e => e.AppointmentId)
                .OnDelete(DeleteBehavior.Cascade);

            builder
                .HasOne(e => e.Result)
                .WithMany(c => c.AppointmentParticipationsAsResult)
                .HasForeignKey(e => e.ResultId)
                .OnDelete(DeleteBehavior.SetNull);

            builder
                .HasOne(e => e.Prediction)
                .WithMany(c => c.AppointmentParticipationsAsPrediction)
                .HasForeignKey(e => e.PredictionId)
                .OnDelete(DeleteBehavior.SetNull);
        }
    }

Почему установка внешнего ключа на ноль вызывает циклы или несколько каскадных путей? Я думал, что это может быть только в случае с каскадом удаления поведения? Я действительно смущен: - (

...