DbContext 不返回本地对象

2024-01-06

我正在使用工作单元模式,在 webapi 请求上执行所有操作后调用 dbcontext.SaveChanges 。在请求的一部分中,我将一个新客户添加到 dbcontext。

dbContext.Customers.Add(new Customer());

稍后在请求中(通常在域事件处理程序内部),我使用相同的 dbcontext 将客户拉出来。

_dbContext.Customers.FirstOrDefault(x => x.Id == id);


public abstract class Customer
{
    public Customer()
    {
        Id = Guid.NewGuid();
    }

}

我已经验证 dbContext.Customers.Local 具有我期望的对象,但它似乎没有提取本地对象。这可能是因为 Customer 是一个抽象类,由 DirectCustomer 和 InDirectCustomer 实现吗?

为什么?我可以通过配置更改此行为吗?也许我必须合并本地结果和数据库结果(有点hacky)。

更新:

class Program
{
    static void Main(string[] args)
    {
        MyDbContext context = new MyDbContext();

        Guid customerGuid = Guid.NewGuid();

        context.Customers.Add(new DirectCustomer()
        {
            Id = customerGuid
        });

        // This does not work, customerFromLocal1 is null
        var customerFromLocal1 = context.Customers.FirstOrDefault(x => x.Id == customerGuid);

        // This does work, customerFromLocal2 is NOT null
        var customerFromLocal2 = context.Customers.Find(customerGuid);


    }
}


public class MyDbContext : Microsoft.EntityFrameworkCore.DbContext
{
    public DbSet<Customer> Customers { get; set; }


    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("server=.\\sqlexpress;integrated security=true;database=EFCoreDeepDive2");
        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<DirectCustomer>();
        builder.Entity<IndirectCustomer>();
    }

}

public abstract class Customer
{
    public Guid Id { get; set; }
}

public class DirectCustomer : Customer
{

}

public class IndirectCustomer : Customer
{
    public Guid ParentCustomerId { get; set; }
}

在 EF Core 中,Linq 运算符(例如 FirstOrDefault()、ToList() 等及其异步中的对应部分)会导致针对服务器评估查询。对于查询来说,服务器数据是事实来源。如果返回对象已加载到内存中,它将合并它们,但它会首先与服务器检查。

当您将新的实体对象添加到上下文时,该对象存在于changetracker中,但在您调用之前它不会保存到服务器SaveChanges()。因此,在添加实体之后和调用之前SaveChanges对于将针对服务器进行评估的任何查询,将没有有关新添加的实体的信息,并且不会返回与其相关的任何结果。

如果您尝试通过当前上下文实例中的键值查找实体对象(可能已保存或未保存),则使用context.DbSet.Find()方法(上下文中还定义了其他变体。Find 方法首先检查 ChangeTracker 以查找对象,其中包含内存中加载的所有对象以及添加/修改的对象。如果找不到,则将从服务器加载对象。在你的情况,因为你想找到已添加到上下文但未保存的实体,Find会给你预期的结果。

Note: DbSet.Local包含当前上下文正在跟踪的 DbSet 类型的所有实体。因此,添加的实体在那里可用,但不能直接在 DbSet 上使用。 DbSet 是 IQueryable 的,以便允许针对它编写服务器查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DbContext 不返回本地对象 的相关文章

随机推荐

  • 使设置随机种子独立的函数

    有时我想编写一个随机函数 它始终为特定输入返回相同的输出 我总是通过在函数顶部设置随机种子然后继续来实现这一点 考虑以这种方式定义的两个函数 sample 12 lt function size set seed 144 sample 1
  • 更改运行 Windows 窗体程序的用户

    我用 C 编写了一个简单的 Windows 窗体程序 我希望能够输入 Windows 用户名和密码 当我单击登录按钮来运行代码时 我会以我输入的用户身份运行代码 您可以使用 WindowsIdentity Impersonate 方法来 实
  • iOS购买收据验证失败怎么办?

    iOS购买收据服务器验证通常是这样的 用户在 iPhone 上购买 您的应用程序将购买收据发送到服务器 服务器收到收据并发送给Apple进行验证 服务器从Apple获取验证结果 服务器将验证结果发送给应用程序 但如果只有第 1 步成功怎么办
  • 带填充的 Python 整数到十六进制字符串

    考虑一个整数 2 我想将其转换为十六进制字符串 0x02 通过使用python的内置函数hex 我可以获得 0x2 这不适合我的代码 谁能告诉我如何以方便的方式获得我想要的东西 谢谢 integer 2 hex string 0x 02x
  • 将 CoreData 添加到现有项目

    我正在尝试将 CoreData 添加到现有项目中并且 有奇怪的错误 我收到错误 由于未捕获的异常而终止应用程序 NSInvalidArgumentException 原因 无法创建 NSPersistentStoreCoordinator
  • 当 `git add` 操作时,“不会添加文件别名‘samefile’(‘SameFile’已存在于索引中)”

    我下载了linux的内核源代码 并且想要git add商场 When I git add git 开始添加它们 但很快它返回一个错误 fatal Will not add file alias include linux netfilter
  • 应用掩码以格式化 SQL Server 查询/视图中的字符串

    有没有一种巧妙的方法可以将掩码应用于 SQL Server 查询中的字符串 我有两张表 一张的电话号码存储为 varchar 没有文字0155567890和电话类型 其中具有该电话号码类型的掩码 返回字符串 对于合并文档 以便查询返回完全格
  • 您可以对多个泛型类型参数强制执行相同的约束吗?

    我知道你可以 你可以这样做 void M
  • 无法在 Linux 上安装 pyodbc

    我正在运行 Linux 2 6 18 164 15 1 el5 centos plus 并尝试安装 pyodbc 我正在执行 pip install pyodbc 并得到一个很长的错误列表 其结尾为 错误 命令 gcc 失败 退出状态为 1
  • 如何减少 SORT 操作中的 CPU 占用

    我正在使用 DFSORT 将磁带数据集复制到临时文件 并处理大约 80000000 条记录 仅复制数据集就需要 3 个小时 有没有其他方法可以减少CPU时间 建议将会非常有帮助 谢谢 STEP40 EXEC SORTD SORTIN DD
  • AWS - IAM 角色和信任关系

    我是 AWS 和 IAM 的新手 正在尝试了解角色和信任关系 我完全理解为什么使用角色 如何创建它们以及它们的用例 我不明白的是信任关系步骤 在我见过的几乎所有案例中 都是一对一的关系 EC2 需要与 EC2 建立信任 为什么会有额外的步骤
  • 如何在 .env 文件中定义数组/对象?

    以下是我的 Javascript 对象 window options VAR1 VAL1 VAR2 VAL2 VA31 VAL3 我希望它 对象或数组 定义在 env文件 我怎样才能做到这一点 值在 env值只能是字符串 简单的解决方法是将
  • 在 directx 11 中渲染 h264 视频帧

    我是新来的DirectX 我正在尝试编写一个自定义 IP 摄像机视频播放器 并且我正在使用它DirectX11使用 Wpf Gui 作为前端渲染解码图像 I am a 时间 2019 03 17 标签 c developer并使用了托管的d
  • 使用 Backbone.js 和 Underscore,如何从模型中获取项目数?

    我有一个用于通知的通知模型 MODEL NotificationModel App BB Model extend defaults COLLECTION NotificationCollection App BB Collection e
  • Django 管理员登录返回 Forbidden 403 CSRF 验证失败。请求已中止

    对 Django 来说还很陌生 按照 Django 网站上的民意调查教程完成第二个项目 之前的努力虽然简单 但进展顺利 这次访问管理员登录时遇到问题 当我尝试登录时 我已经创建了一个超级用户并使用这些凭据http 127 0 0 1 800
  • Android - OnClick Listener 在一个单独的类中

    是否可以创建一个辅助类来保存 OnClick 侦听器 意思是不是在 Activity 类中创建的 我只是发现将 OnClick 侦听器放在主活动类中很混乱 我宁愿将它们放在单独的类中 谢谢 当然 这是可能的 只需创建一个实现的类View O
  • 在android中创建水平和垂直的虚线

    我想在android中使用形状绘制水平和垂直的虚线 我想画成这样 对于水平线
  • 更新 Heroku 上的堆栈

    我有一个小应用程序在那里运行 使用heroku buildpack perl https github com miyagawa heroku buildpack perl构建包 这只是一个小Plack http p3rl org Plac
  • 调用析构函数后访问对象

    在下面的代码中我调用 destructor 明确地 但是该对象仍然可以访问 我怎样才能删除它 让它消失 class Queue public node top NULL points to the top of the queue meth
  • DbContext 不返回本地对象

    我正在使用工作单元模式 在 webapi 请求上执行所有操作后调用 dbcontext SaveChanges 在请求的一部分中 我将一个新客户添加到 dbcontext dbContext Customers Add new Custom