【发布时间】: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