Skip to Main Content

ODP.NET

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

Bug in Oracle.EntityFrameworkCore version 8.23.40 - 50 - AddAsync, SaveChangesAsync

JC99Sep 10 2024 — edited Sep 10 2024

This code:

public async Task<IActionResult> UpdateAsync() // no relevant for bug
{
    var texts = new string[] { "Text1", "Text2" };
    var dbContext = _serviceProvider.GetRequiredService<MyDbContext>();
    var txn = dbContext.Database.BeginTransaction(); // no relevant for bug           
    texts.ToList().ForEach(async textValue =>
    {
        var entity = new TextTable() { Text = textValue };
        _ = await dbContext.Set<TextTable>().AddAsync(entity);
        await dbContext.SaveChangesAsync(); // bug occure on second call
    });
    txn.Rollback(); // no relevant for bug
    return BadRequest(); // no relevant for bug
}

raises an exception and causes the application to crash hard.

Version 8.21.150 does not cause this problem.

Exception:

System.InvalidOperationException
  HResult=0x80131509
  Message=A second operation was started on this context instance before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.
  Source=Microsoft.EntityFrameworkCore
  StackTrace:
   at Microsoft.EntityFrameworkCore.Infrastructure.Internal.ConcurrencyDetector.EnterCriticalSection()
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<SaveChangesAsync>d__111.MoveNext()
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.<SaveChangesAsync>d__115.MoveNext()
   at Oracle.EntityFrameworkCore.Storage.Internal.OracleExecutionStrategy.<ExecuteAsync>d__8`2.MoveNext()
   at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__63.MoveNext()
   at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__63.MoveNext()
   at Api.Controllers.TestController.<>c__DisplayClass6_0.<<UpdateAsync>b__0>d.MoveNext() in C:\TestController.cs:line 20

Notes:

  • dotnet 8, EF 8.0.8
  • MyDbContext is generated from database.
  • PrimaryKey in TextTable is column ID - NUMBER(12). ID is automatic generated by trigger and sequence
modelBuilder.Entity<TextTable>(entity =>
{
    entity.HasKey(e => e.Id).HasName("PK_TEXT_TABLE");
    entity.ToTable("TEXT_TABLE");
    entity.Property(e => e.Id)
        .HasPrecision(12)
        .HasColumnName("ID");
    entity.Property(e => e.Text)
        .HasMaxLength(20)
        .IsUnicode(false)
        .HasColumnName("TEXT");
    ...
    ...
}
This post has been answered by Alex Keh-Oracle on Sep 11 2024
Jump to Answer
Comments
Post Details
Added on Sep 10 2024
4 comments
86 views