c# - 如何清除 Entity Framework 中的跟踪实体

标签 c# entity-framework

我正在运行一些运行在一大堆实体上的校正代码,随着它的进展速度降低,这是因为上下文中跟踪的实体数量随着每次迭代而增加,这可能需要很长时间,所以我正在保存更改在每次迭代结束时。每次迭代都是独立的,不会更改先前加载的实体。

我知道我可以关闭更改跟踪,但我不想这样做,因为它不是批量插入代码,而是加载实体并计算一些东西,如果数字不正确,请设置新数字并更新/删除/创建一些额外的实体。我知道我可以为每次迭代创建一个新的 DbContext,这可能比在同一实例中执行所有操作运行得更快,但我认为可能有更好的方法。

所以问题是;有没有办法清除之前在数据库上下文中加载的实体?

最佳答案

您可以向 DbContext 添加方法或使用 ChangeTracker 分离所有已添加、已修改和已删除实体的扩展方法:

public void DetachAllEntities()
{
    var changedEntriesCopy = this.ChangeTracker.Entries()
        .Where(e => e.State == EntityState.Added ||
                    e.State == EntityState.Modified ||
                    e.State == EntityState.Deleted)
        .ToList();

    foreach (var entry in changedEntriesCopy)
        entry.State = EntityState.Detached;
}

关于c# - 如何清除 Entity Framework 中的跟踪实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27423059/

相关文章:

C# - 防止重新编译

c# - expression.bind 和 expression.assign 之间有什么区别(或 : what is special about MemberBinding)

c# - 在一次调用中从多个表中进行选择

mysql - 如何用 MySQL DB 替换 SQL DB 并启用 Entity Framework Code First?

entity-framework - Entity Framework 6 异步并行查询是否使用多个事件结果集进行连接池

c# - 我可以将 AsyncLocal 与 azure 函数一起使用吗?

c# - 如何在 ASP MVC 中选中复选框时禁用 DropDownList

c# - 带有 MySQL 的 ASP.NET MVC EF 需要 .dll 及其用法?

c# - Entity Framework +LINQ表达式外连接错误

asp.net - 添加标签来讨论 Entity Framework 中的多对多关系