Domanda

Ho un programma basato codefirst EF-4.1. L'utente riceve un contesto e può modificare alcune proprietà. Quando l'utente è fatto, faccio un rapido

ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);

per determinare se è necessario o meno un SaveChanges(). Se faccio un 'SaveChanges ()' chiamata, i cambiamenti che hanno fatto sono persistenti al database.

Questo funziona per alcune proprietà, e non funziona per gli altri. In particolare sembra funzionare con tipi semplici (floats), e con gerarchie di raccolta (ObservableCollections).

sto facendo qualcosa di sbagliato?

È stato utile?

Soluzione

Sì, questo è un problema. Alcuni rapporti non sono tracciati da DbChangeTracker. C'è differenza tra e degli Esteri associazione tasto . Modifiche a relazione sono tracciati in caso di:

  • One-to-one rapporto che è sempre l'associazione chiave esterna nella EFv4 +
  • Uno-a-molti relazione con l'associazione Chiave esterna - è necessario impostare proprietà chiave esterna

Le modifiche al rapporto non sono tracciati in caso di:

  • Uno-a-molti relazione con l'associazione indipendente
  • molti-a-molti relazione che è sempre un'associazione indipendente

Non monitorati per associazione indipendente non è corretta denominazione. Questi cambiamenti sono monitorati ma DbChangeTracker non lo fa esporre l'accesso a questi cambiamenti ! È necessario convertire DbContext a ObjectContext e l'uso ObjectStateManager per avere accesso a ObjectStateEntries che rappresenta le associazioni indipendenti.

In questo caso la cosa più semplice è semplicemente SaveChanges chiamata sempre. Non verrà eseguito alcun comando DB, se hanno bisogno di essere salvati non ci sono dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top