Interrogare gli oggetti dopo AddObject prima di SaveChanges?

In EntityFramework, è ansible interrogare gli oggetti che sono stati appena aggiunti al contesto usando AddObject ma prima di chiamare il metodo SaveChanges?

Grazie

puoi interrogare oggetti come questo,

context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Select(obj => obj.Entity).OfType() 

questo interrogherà gli oggetti che sono in stato aggiunto. Se vuoi anche altri stati, puoi passare tutti gli altri stati al metodo GetObjectStateEntries come questo.

 GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Unchanged) 

Per mantenere un’entity framework, di solito lo aggiungi al suo DbSet nel contesto.

Per esempio

 var bar = new Bar(); bar.Name = "foo"; var context = new Context(); context.Bars.Add(bar); 

Sorprendentemente, interrogando context.Bars , l’ quadro appena aggiunta non può essere trovata

 var howMany = context.Bars.Count(b => b.Name == "foo"); // howMany == 0 

Dopo context.SaveChanges() la stessa riga risulterà 1

DbSet sembra ignorare le modifiche finché non vengono mantenute su db.

Fortunatamente, ogni DbSet ha una proprietà Local che si comporta come DbSet stesso, ma riflette tutte le operazioni in memoria

 var howMany = context.Bars.Local.Count(b => b.Name == "foo"); // howMany == 1 

Puoi anche usare Local per aggiungere entity framework

 context.Bars.Local.Add(bar); 

e sbarazzarsi del comportamento strano di Entity Framework.

In caso di sospensione le istanze transitori sono già collegate al contesto. Sono appena incappato in questa restrizione EF.

Non sono riuscito a intersecare / ObjectSet l’ ObjectSet con le sue entity framework transitori ObjectSet.Local ma per il nostro caso il metodo di ricerca sottostante è sufficiente.

Nei nostri casi creiamo alcune quadro pigre in base a criteri univoci durante un’iterazione

Trova il metodo

Se si utilizza un modello di repository è ansible creare un metodo come:

 public interface IRepository where T : class, IEntity { ///  /// Finds the unique Entity with the given predicate. /// Depending on implementation also checks transient / local (unsaved) Entities. ///  ///  ///  IQueryable FindAll(Expression> predicate); } public class EfRepository : IRepository where T : class, IEntity { protected readonly ObjectContext context; protected readonly ObjectSet objectSet; ///  /// Creates a new repository of the given context. ///  ///  public EfRepository(ObjectContext context) { if (context == null) throw new ArgumentException("Context must not be null."); this.context = context; this.objectSet = context.CreateObjectSet(); } ///  /// Also takes local context into consideration for unsaved changes ///  ///  ///  public T Find(Expression> predicate) { T result = this.objectSet.Where(predicate).FirstOrDefault(); if (result == null) result = this.objectSet.Local().Where(predicate).FirstOrDefault(); return result; } }