У меня есть 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");
});
Как я могу исправить это, чтобы работать в тех же транзакциях для целей отката? Мне нужно убедиться, что обе сущности созданы или никакие сущности не созданы.