【问题标题】:Cannot SaveChanges in .NET 5 EF Core with Devart.Data.Oracle.EFCore无法使用 Devart.Data.Oracle.EFCore 在 .NET 5 EF Core 中保存更改
【发布时间】:2021-03-25 23:27:39
【问题描述】:

我目前正在开发一个 ASP .NET 5.0 应用程序 - 我将应用程序从 .NET3.1 迁移到 .NET 5.0。我使用 Entity Framework Core 和 Devart.Data.Oracle.EFCore 连接到 Oracle 数据库。

我尝试使用字符串值保存一个简单的记录,当我调用 Context.SaveChangesAsync() 方法时,我收到此错误:Sequence contains no elements,奇怪的是异常的来源是System.Linq => System.Linq.ThrowHelper.ThrowNoElementsException()。不幸的是,有一个 StackTrace 但没有详细的内部异常消息。

我在存储库中的保存方法如下所示:

public async Task<T> Add(T entity)
{
    // ...   
    await Context.AddAsync<T>(entity);
    await Context.SaveChangesAsync();

    return entity;
}

Tree 实体类如下所示:

public class Tree
{
    public int Id { get; set; }
    public string Name { get; set; }
}

树实体配置如下所示(使用 EF Core 搭建):

public void Configure(EntityTypeBuilder<Tree> entity)
{
    entity.ToTable("TREES");

    entity.HasIndex(e => e.Id, "SYS_C001234")
          .IsUnique();

    entity.Property(e => e.Id).HasColumnName("ID");

    entity.Property(e => e.Name).HasColumnName("NAME");
}

在我的 AppContext 上,树已注册:

public virtual DbSet<Tree> Trees { get; set; }

在 DB 中,Tree 表如下所示:

Column_Name | Data_Type
------------------------
ID          | NUMBER(10,0)
NAME        | NCLOB

这很奇怪,因为它在我将我的应用程序移植到 .NET 5.0 并更新所有 NuGet 包之前就可以工作...

我追踪到以下 NuGet 包更新的错误:

我无法单独更新 Devart.Data.Oracle.EFCore,因为它依赖于下面列出的 Microsoft NuGet 包。我必须一次更新所有 5 个 NuGet 包。

此 NuGet 包更新后,我无法再保存实体。

也许我的配置中缺少某些内容?

你知道如何解决这个问题吗?

【问题讨论】:

  • 发布 actual 抛出的代码和 full 异常,而不是“类似这样的东西”。看起来您在 EF 上放置了一个“通用存储库”,尽管 EF 不仅已经实现了 Repository,而且还实现了 Unit-of-Work。 SaveChanges 保存 所有 未决更改,而不仅仅是最后一个。这使得尝试立即保存错误的Add 方法 - 充其量,它具有非常糟糕的性能并破坏了 UoW。最坏的情况,它可以执行 42 次删除和 67 次更新以及插入。
  • 要了解为什么使用“存储库”是个坏主意,请查看 Gunnar Peipman 的 No need for repositories and unit of work with Entity Framework Core。至于异常,Sequence contains no elements 通常从Single() 或其他期望找到至少一个结果的调用中抛出。绝对不是Add(它不调用数据库)或SaveChanges。异常的堆栈跟踪将显示调用了什么方法。
  • 这不是保存问题。您没有连接到数据库。当应用程序启动时,它会从数据库中获取最新数据。如果您没有获得任何数据,那么您在保存时会收到错误消息“序列不包含任何元素”。请参阅:github.com/oracle/dotnet-db-samples/issues/81

标签: c# oracle entity-framework devart .net-5


【解决方案1】:

在 EF Core 5 中插入或更新时抛出“序列不包含元素”的错误已修复。我们将在本周发布新的 dotConnect for Oracle 公开版本。

【讨论】:

猜你喜欢
  • 2018-03-07
  • 2017-03-16
  • 1970-01-01
  • 2021-02-22
  • 2011-08-29
  • 2021-04-19
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多