gpt4 book ai didi

entity-framework - 使用 InMemoryDatabase 时如何禁用预加载

转载 作者:行者123 更新时间:2023-12-03 07:06:42 28 4
gpt4 key购买 nike

我有一个 EF.Core 2.1 DataContext,但我尚未启用延迟加载。

我的配置如下:

services.AddDbContext<DataContext>(options =>  
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

我的测试使用相同的 DataContext 但使用不同的选项,如下所示:

options.UseInMemoryDatabase(databaseName: "ProjectSpecs")

这一切都工作正常,只是我的内存中的 DataContext 急于加载所有内容。

如果我请求一个实体,它是否会加载所有相关对象。

这意味着如果我想实际加载相关属性但忘记这样做,我的测试将在相关实体加载时通过。但在实际应用程序中,由于 .include 被遗忘而失败。

我可以让内存中的 DataContext 表现得和真实的一样吗?

最佳答案

我遇到了同样的问题,在阅读了一堆有关该主题的文章后,我得出的结论是,问题实际上是因为被测代码正在从 ChangeTracker 中读取,其中测试代码已经组装了对象图。有了这些知识,我就使用了 DbContext 并重写了 SaveChanges 方法,如下所示。

public override int SaveChanges()
{
var affectedRows = base.SaveChanges();

if (Database.ProviderName == "Microsoft.EntityFrameworkCore.InMemory")
{
ChangeTracker.Entries()
.Where(e => e.Entity != null)
.ToList()
.ForEach(e => e.State = EntityState.Detached);
}

return affectedRows;
}

通过分离 ChangeTracker 中的每个对象,它强制测试中的代码返回到数据库,而不是从 ChangeTracker 中提取现有的对象图。

关于entity-framework - 使用 InMemoryDatabase 时如何禁用预加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52740665/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com