【问题标题】:Is it possiible to Add in DbContext without tracking in .net core是否可以在不跟踪 .net 核心的情况下添加 DbContext
【发布时间】:2020-01-15 22:18:13
【问题描述】:

是否可以在 .NET Core 中执行 Add、AddAsync、Update 等而无需随后跟踪实体而无需编写代码来专门将上下文与跟踪实体分离?

// select, its possible to do no trackiing
var audit = _dbContext.Audit.First().AsNoTracking();

// doing an add or update, audit is now tracked unless it's detached
_dbContext.Audit.Add(audit);
int rows = _dbContext.SaveChanges();
_dbContext.Entry(audit).State = EntityState.Detached;

我问这个是因为我有一个使用 RabbitMq 消息并写入数据库的 Windows 服务。 RabbitMq 通过事件处理程序接收消息。所以数据库本质上变成了一个单例,即使它是作为瞬态添加的。我每次都可以创建一个新的数据库上下文。但这似乎有点矫枉过正。还是有更好的办法?

【问题讨论】:

  • 不,创建一个新的上下文并不是矫枉过正,它已经为此做好了准备并进行了优化。 NoTracking 意味着,你确定,你不修改实体,没有人应该观察它。如果你添加新的,你肯定会修改实体,不跟踪它就意味着不保存它。

标签: c# .net-core entity-framework-core


【解决方案1】:

您不应该使用单例 DbContext,因为它不是线程安全的。 您可以查看这篇博文,了解管理 DbContext 的不同方法: https://mehdi.me/ambient-dbcontext-in-ef6/

【讨论】:

  • 谢谢,是的,我在 Windows 服务中将其添加为瞬态。我的问题是窗口服务通过事件处理程序侦听和处理rabbit mq 消息。所以我会做的是,当收到消息时,我将新建一个类来处理包含 dbcontext 的消息,我还需要将其用作消息处理的一部分,因为我需要与遗留数据库 Ingres 对话, postgres的前身。所以这也将被重新创建。你看到后者有问题吗?我主要通过 ODBC 将它用作 ado.net 网桥。应该和 dapper 一起去,但现在为时已晚
猜你喜欢
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 2015-11-14
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多