Обновление до версии tnet 3.1 из 2.2 приводит к тому, что транзакции вставляют проблемы с внешним ключом при добавлении в 2 разные таблицы. - PullRequest
0 голосов
/ 22 января 2020

У меня есть API, который раньше выполнял tnet 2.2, который мы обновили непосредственно до 3.1. Когда вызывается маршрут для добавления нового файла в базу данных, он создает 2 разных объекта в транзакции и после этого вызывает SaveChangesAsyn c ().

await _unitOfWork.PublicationFiles.CreateAsync(file);
await _unitOfWork.PublicationFileContents.CreateAsync(new PublicationFileContent { FileId = file.FileId, FileContent = fileContents.ElementAt(index) });
await _unitOfWork.CommitAsync(); //This just calls _context.SaveChangesAsync()

Как видите, вторая сущность опирается на fileid первой сущности, которая будет сгенерирована. Кажется, что 2.2 будет делать вызовы один за другим, и это будет работать.

Ошибка:

ОШИБКА Оператор INSERT конфликтует с ограничением FOREIGN KEY "FK_PublicationFileContent_PublicationFiles". Конфликт произошел в базе данных «DATABASE», таблице «dbo.PublicationFiles», столбце «FileId».

Вот модельBuilder для обеих сущностей:

 modelBuilder.Entity<PublicationFile> (entity => {
                entity.HasKey (e => e.FileId)
                    .IsClustered (false);

                entity.HasIndex (e => e.DownloadDate)
                    .HasName ("IX_PublicationFilesDownloadDate")
                    .IsClustered ();

                entity.HasIndex (e => e.ParseStatus)
                    .HasName ("IX_PublicationFilesParseStatus");

                entity.HasIndex (e => new { e.FileName, e.PublicationId })
                    .HasName ("IX_PublicationFiles_PublicationId");

                entity.Property (e => e.DownloadDate).HasColumnType ("datetime");

                entity.Property (e => e.FileDate).HasColumnType ("datetime");

                entity.Property (e => e.FileName).HasMaxLength (255);

                entity.Property (e => e.ParseEnd).HasColumnType ("datetime");

                entity.Property (e => e.ParseServer).HasMaxLength (50);

                entity.Property (e => e.ParseStart).HasColumnType ("datetime");

                entity.Property (e => e.ProvidedDate).HasColumnType ("datetime");

                entity.HasOne (d => d.Publication)
                    .WithMany (p => p.PublicationFiles)
                    .HasForeignKey (d => d.PublicationId)
                    .HasConstraintName ("FK_PublicationFiles_Publications");
            });
 modelBuilder.Entity<PublicationFileContent> (entity => {
                entity.HasKey (e => e.FileId);

                entity.ToTable ("PublicationFileContent");

                entity.Property (e => e.FileId).ValueGeneratedNever ();

                entity.HasOne (d => d.File)
                    .WithOne (p => p.PublicationFileContent)
                    .HasForeignKey<PublicationFileContent> (d => d.FileId)
                    .HasConstraintName ("FK_PublicationFileContent_PublicationFiles");
            });

Как я могу исправить это, чтобы работать в тех же транзакциях для целей отката? Мне нужно убедиться, что обе сущности созданы или никакие сущности не созданы.

1 Ответ

0 голосов
/ 22 января 2020

Нашел проблему. Произошло критическое изменение в do tnet 3.0.

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#temporary -key-values-no-Больше-set-on-Entity-экземпляры

Пришлось изменить мою вторую строку создания, чтобы использовать свойство навигации вместо идентификатора.

await _unitOfWork.PublicationFileContents.CreateAsync(new PublicationFileContent { FileId = file, FileContent = fileContents.ElementAt(index) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...