2010-04-26 13 views
20

Desidero essere in grado di determinare se sono presenti dati non salvati in un contesto di entità. Ho capito come usare ObjectStateManager per controllare gli stati delle entità esistenti, ma ci sono due problemi con questo.Come sapere se entità nel contesto sono sporche con .Net Entity Framework 4.0

  1. Preferirei una singola funzione da chiamare per vedere se eventuali entità non sono salvate invece di eseguire il ciclo nonostante tutte le entità nel contesto.
  2. Non riesco a capire come rilevare le entità che ho aggiunto. Questo mi suggerisce che non comprendo pienamente come funziona il contesto dell'entità. Ad esempio, se ho ObjectSet myContext.Employees e aggiungo un nuovo dipendente a questo set (con .AddObject), non vedo la nuova entità quando guardo l'ObjectSet e non vedo il .Count aumentare. Tuttavia, quando faccio un context.SaveChanges(), la mia nuova entità è persistente ... eh?

sono stato in grado di trovare una risposta a questo nelle mie ricerche MSDN, così mi è stato sperando che qualcuno qui sarebbe in grado di indizio me.

Grazie in anticipo.

risposta

15
var addedStateEntries = Context 
    .ObjectStateManager 
    .GetObjectStateEntries(EntityState.Added); 
+1

Ok, sembra la risposta. Sono ancora un po 'confuso sul perché ObjectSet myContext.Employees non contenga l'entità che ho appena aggiunto. –

+1

Perché 'ObjectSet's sono query, non raccolte. –

+0

Ok, stiamo arrivando alla mia incomprensione su cosa dovrebbero essere quegli ObjectSet. Quindi, è corretto dire che quegli ObjectSet sono solo lo stato del database delle entità? Se ciò è vero, esiste una raccolta che, ad esempio, ha tutte le entità Employee che sono in memoria (non solo quelle nel database)? –

3

Questo articolo descrive esattamente ciò che è necessario per eseguire il rilevamento delle modifiche in Entity Framework:

Identity Resolution, State Management, and Change Tracking (Entity Framework) - MSDN

+0

impressionante. Non so come mi sia mancato. Grazie. –

+0

In realtà, ho appena letto quell'articolo e non risponde alla mia domanda. Ho bisogno di sapere cosa succederà se faccio un .SaveChanges. Le nuove entità aggiunte con context.AddObject non vengono visualizzate nelle proprietà ObjectSet al di fuori dell'oggetto contesto, quindi non posso ottenere un riferimento a esse per verificarne lo stato. –

6

Un modo semplice per ottenere un riutilizzabile singolo metodo/proprietà che si potrebbe aggiungere un nuovo metodo per il tuo ObjectContext creando una classe parziale e aggiungendo una proprietà come questa:

public partial class MyEntityContext 
{ 
    public bool IsContextDirty 
    { 
    get 
    { 
     var items = ObjectStateManager.GetObjectStateEntries(EntityState.Added); 
     if(items.Any()) 
     return true; 
     items = ObjectStateManager.GetObjectStateEntries(EntityState.Deleted); 
     if (items.Any()) 
     return true; 
     items = ObjectStateManager.GetObjectStateEntries(EntityState.Modified); 
     if(items.Any()) 
     return true; 
     return false; 
    } 
    } 
} 

A seconda di ciò che stai cercando potresti esporre altre proprietà per sapere se ci sono solo eliminazioni o modifiche. Questo metodo potrebbe essere semplificato, ma volevo che fosse chiaro cosa avresti bisogno di fare.

+3

Post updated.Non usare mai 'Count()> 0' invece di' Any() ',' Count() 'scorre attraverso l'intera collezione per ottenere il numero,' Any() 'restituirà true alla prima iterazione. – Shimmy

+0

Inoltre, 'GetObjectStateEntries' non dovrebbe restituire' null'. – Shimmy

8

Via metodo di estensione (per ogni ObjectContext):

internal static class ObjectContextExtensions 
{ 
    public static bool IsContextDirty(this ObjectContext objectContext) 
    { 
     return objectContext 
      .ObjectStateManager 
      .GetObjectStateEntries(
       EntityState.Added | 
       EntityState.Deleted | 
       EntityState.Modified).Any(); 
    } 
} 

o tramite il metodo parziale (solo per il vostro ObjectContext):

partial class MyModel 
{ 
    public bool IsContextDirty() 
    { 
     return ObjectStateManager 
      .GetObjectStateEntries(
       EntityState.Added | 
       EntityState.Deleted | 
       EntityState.Modified).Any(); 
    } 
} 
Problemi correlati