【问题标题】:Stop related entities being loaded automatically in Sqlite in-memory dB using Entity Framework Core使用 Entity Framework Core 停止在 Sqlite 内存 dB 中自动加载相关实体
【发布时间】:2019-09-18 23:33:54
【问题描述】:

我使用的是 EF Core (v1.1.3) 和 C#。

在我的单元测试中,我使用代码优先数据库模型创建了一个 sqlite 内存数据库,然后用一些测试数据填充它。但是,当从 dB 加载实体列表时,尽管没有使用“.Include”,但相关实体会被填充。

如果我使用相同的模型来创建一个实际的磁盘数据库并执行相同的加载,那么只有在我使用 .Include 时才会加载相关实体。

这是 sqlite 内存实现 (v1.1.0) 中的错误,还是我遗漏了什么?

我已经检查过数据库中没有任何内容被跟踪,显然我无法释放上下文并更新它,因为它在内存中,我目前仅限于这个版本的 EF & Sqlite , 由于遗留原因。

显然,为了性能,我更愿意为单元测试提供内存选项,而不是开始创建磁盘测试。

【问题讨论】:

  • "...显然我无法处理上下文并更新它,因为它在内存中..." - 为什么不呢?
  • 请张贴minimal reproducible example 你是如何为 " 创建上下文的...但是当从 dB 加载实体列表时,尽管没有 '.Include,但相关实体会被填充' 正在使用..."
  • @MickeyD。我不能处理上下文,因为一旦你这样做,所有内容都会丢失!我
  • 在谷歌搜索和阅读 this answer 之后,EF Core 直到 EF Core 2.1 才引入自动延迟加载(这可以解释您的问题)。考虑到您使用的是 EFC v1.1x,您应该只使用 eagerexplcit。不知道是什么导致了这个问题
  • “我是cant disposecontext,因为一旦你这样做了,所有内容都将是lost!” - Incorrect。也许您正在考虑连接?确保您使用的是DbContextOptionsBuilder

标签: c# sqlite entity-framework-core in-memory-database


【解决方案1】:

我遇到了完全相同的问题。

您需要做的是将您为测试创建的实体的状态设置为Detatched。然后,当您再次尝试读取实体时,EF 将从 DB 中获取它。

在创建新实体后写下这一行:

dbContext.Entry(entity).State = EntityState.Detached;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2018-02-27
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多