实体框架如何从数据上下文中分离所有特定类型的对象?

Ste*_*hen 3 c# entity-framework

当前,我正在尝试在我的datacontext.savechanges()方法之前实现代码,该方法将从数据上下文中分离特定类型的所有对象,以使它们不会插入数据库中。我知道你可以打电话dbContext.Entry(entity).State = EntityState.Detached分离单个实体,但是有没有一种方法可以从上下文分离特定类型的所有对象?

编辑:我实现了Mark C的建议并进行了编译,但是当我尝试执行代码时遇到了无效的操作异常:

实体类型DbEntityEntry不是当前上下文模型的一部分。

   foreach (System.Data.Entity.Infrastructure.DbEntityEntry dbEntityEntry in this.dataContext.ChangeTracker.Entries<Customer>())
            {
                if (dbEntityEntry != null && dbEntityEntry.State != System.Data.Entity.EntityState.Modified && dbEntityEntry.State != System.Data.Entity.EntityState.Unchanged)
                {
                    dataContext.Entry(dbEntityEntry).State = System.Data.Entity.EntityState.Detached;
                }
            }
Run Code Online (Sandbox Code Playgroud)

编辑#2:在仔细研究之后,我犯了一个错误。似乎需要在DBEntityEntry上指定实体。通过以下更改,它可以工作:

        foreach (System.Data.Entity.Infrastructure.DbEntityEntry dbEntityEntry in this.dataContext.ChangeTracker.Entries<Customer>())
        {
            if (dbEntityEntry.Entity != null && dbEntityEntry.State != System.Data.Entity.EntityState.Modified && dbEntityEntry.State != System.Data.Entity.EntityState.Unchanged)
            {
                dataContext.Entry(dbEntityEntry.Entity).State = System.Data.Entity.EntityState.Unchanged;
            }
        }
Run Code Online (Sandbox Code Playgroud)

感谢Gert建议使用EntityState.Unchanged而不是EntityState.Detached。

Tho*_*ter 11

从 Efcore 5.0 开始您可以使用

 _ctx.ChangeTracker.Clear();
Run Code Online (Sandbox Code Playgroud)

如果您不想要所有条目,请参阅Mark C的回答。

请注意,根据 Microsoft api 文档,此方法速度很慢并且可能会产生副作用_ctx.ChangeTracker.Clear()


Mar*_* C. 5

你可以写类似

foreach (DbEntityEntry dbEntityEntry in this.ChangeTracker.Entries())
            {
                if (dbEntityEntry.Entity != null)
                {
                  // Here you can look at typeof and the EntityState
                }
            }
Run Code Online (Sandbox Code Playgroud)

感谢KeithS指出,您也可以使用重载ChangeTracker.Entries()来使用特定的Entity类型。

this.ChangeTracker.Entries<SomeEntityEntity>()