如何刷新DbContext

Moh*_*sen 21 c# entity-framework refresh entity-framework-4 dbcontext

我想刷新我的所有实体DbContext而不重新创建它,我尝试了以下内容,但没有一个是有意义的:

var context = ((IObjectContextAdapter)myDbContext).ObjectContext;

var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(
                                   EntityState.Added
                                   | EntityState.Deleted
                                   | EntityState.Modified
                                   | EntityState.Unchanged)
                          where entry.EntityKey != null
                          select entry.Entity);

context.Refresh(RefreshMode.StoreWins, refreshableObjects);
//.......................................................................
foreach (var entry in this.Orm.ChangeTracker.Entries())
{
    entry.State = EntityState.Unchanged;
}
this.Orm.ChangeTracker.DetectChanges();
Run Code Online (Sandbox Code Playgroud)

唯一一个刷新我的DbContext:

foreach (var i in this.Orm.ChangeTracker.Entries())
    i.Reload();
Run Code Online (Sandbox Code Playgroud)

但它太慢了.你能帮我选择正确的方法吗?

Moh*_*sen 36

我刚刚发现Enumerable应该评估结果,因为该Refresh方法将其作为对象获取并且不对其进行评估.

var context = ((IObjectContextAdapter)myDbContext).ObjectContext;
var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(
                                           EntityState.Added
                                           | EntityState.Deleted
                                           | EntityState.Modified
                                           | EntityState.Unchanged)
                          where entry.EntityKey != null
                          select entry.Entity).ToList();

context.Refresh(RefreshMode.StoreWins, refreshableObjects);
Run Code Online (Sandbox Code Playgroud)

我更喜欢以下内容:

var refreshableObjects = myDbContext.ChangeTracker.Entries().Select(c=>c.Entity).ToList();
context.Refresh(RefreshMode.StoreWins, refreshableObjects);
Run Code Online (Sandbox Code Playgroud)

  • 使用您的方法,我得到:要刷新的对象集合中索引0处的元素处于添加状态.处于此状态的对象无法刷新. (2认同)
  • @isti_spl:你最好在referesh之前回滚`if(entry.State == EntityState.Added)entry.State = EntityState.Detached; // ... (2认同)

yon*_*bat 13

我检查了这个并且id工作正常:

//Search
Box box = dbContext.Boxes.FirstOrDefault(x => x.BoxId == 45);

//breakpoint here, change Name of Box by sql management studio

//Refresh
var context = ((IObjectContextAdapter)dbContext).ObjectContext;
context.Refresh(System.Data.Entity.Core.Objects.RefreshMode.StoreWins, box);

//Check refresh and if it is in context
box = dbContext.Boxes.FirstOrDefault(x => x.BoxId == 45);
Run Code Online (Sandbox Code Playgroud)

你确定它是相同的db-context吗?