2011-01-31 21 views
15

Sto utilizzando Entity Framework per manipolare i dati in un database con esito positivo fino ad ora.Entity Framework - Dati sottostanti (nel database) modifica notifica

Tuttavia, mi piacerebbe avere più di un'applicazione che gioca con i dati allo stesso tempo (edizione simultanea).

C'è un modo per ricevere una notifica quando i dati nel database cambiano?

Ho visto una soluzione che utilizza il trigger DML, ma vorrei sapere se ci sono altri modi per farlo e se sì, qual è la soluzione migliore da usare.

saluti,

Nic

EDIT

Forse le mie domande non era abbastanza chiaro, cercherò di illustrare con un esempio.

  • Applicazione # 1 è utilizzando Entity Framework sulla base di dati # 1
  • Applicazione # 2 è anche utilizzando Entity Framework sulla base di dati # 1
  • Applicazione # 1 cambia il modello di entità che si riflette un cambiamento nella tabella sottostante del database # 1
  • Desidero che l'Applicazione n. 2 venga notificata di questa modifica in modo che possa avere dati coerenti/aggiornati2.
+0

ottima domanda! Lo stesso problema/domanda: http://stackoverflow.com/questions/11627959/entity-framework-data-updates-in-a-multi-user-environment-with-central-database – juFo

+0

Ho anche lo stesso problema –

risposta

5

Forse si dovrebbe pensare l'utilizzo della EF nell'applicazione.contesto di EF dovrebbe essere utilizzato a più breve periodo di tempo possibile:

  • Creare contesto
  • Dati di carico
  • dati Modificare
  • Salva i dati contesto
  • goccia

A causa di l'implementazione interna (IdentityMap, UnitOfWork) del contesto di vita lungo non è una buona scelta e con un breve contesto di vita non si desidera un comportamento menzionato al l. Anche nell'applicazione desktop è necessario utilizzare un approccio simile al contesto per modulo. Carichi i dati, presenti i dati al tuo utente e fino a quel momento solo l'utente può modificare i dati e premere il pulsante Salva: è responsabilità dell'applicazione affrontare i problemi di concorrenza in qualche modo (timestamp). La modifica automatica dei dati che fanno parte dell'unità di lavoro in esecuzione è una pessima idea - cosa succede se l'utente ha già modificato i dati? Sovrascriverà i suoi cambiamenti?

Edit:

Si può leggere di più su impelementation di ObjectContexthere.

Posso immaginare scenari in cui è necessaria la notifica di aggiornamento dei dati alle applicazioni client. Può essere la visualizzazione dei dati in tempo reale in sola lettura, ad esempio le informazioni sul trading azionario. Ma in tal caso hai bisogno di qualcosa di più potente. Non è uno scenario per il client che chiama ORM per ottenere dati, ma lo scenario per il cliente che sottoscrive un servizio/livello intermedio che gestisce il recupero dei dati e la notifica di modifiche rapide.

Per scenari semplici in cui è necessario aggiornare i dati solo in tempo semi-reale, è possibile utilizzare il polling: il client chiamerà nuovamente la query entro pochi secondi e utilizzerà la strategia StoreWins. Qualsiasi strategia di notifica è al di fuori dell'ambito di EF: è necessario implementarla come trigger, dipendenza SQL, modello di iscrizione o altro. Anche con la notifica sarai in grado di gestire alcuni eventi e richiedere i dati.

Ancora una volta, se si desidera ridurre il trasferimento di dati con il polling, è necessario un livello di servizio/medio che consenta un certo livello di memorizzazione nella cache (è anche possibile provare i servizi dati WCF).

+0

Questa risposta è completamente fuori tema. La tua risposta al sondaggio è esattamente il motivo per cui viene posta la domanda. Per evitare il polling. –

+0

https://code.msdn.microsoft.com/How-to-use-SqlDependency-5c0da0b3 –

2

A livello di database, è possibile inserire una colonna timestamp nella tabella e utilizzarla per indicare se una riga è stata aggiornata dal recupero. Questo potrebbe essere verificato da un trigger come suggerito, o da un sistema di monitoraggio nel tuo codice C#, o se vuoi solo evitare di sovrascrivere le modifiche, puoi scrivere gli aggiornamenti sprocs che controllano i timestamp e usarli per salvare le tue entità.

Indipendentemente dall'opzione scelta, è necessario decidere in anticipo come gestire i conflitti.

Timestamp-based concurrency control

+1

+1 per l'approccio migliore qui. Dovete usare il timestamp, questo è l'approccio migliore per i controlli di concorrenza e ora EF 4.2 lo supporta automaticamente. –

0

Non so quale provider utilizzi. Comunque sia Devart che ODP supportano la notifica DB. Per Devart puoi vedere il seguente link OracleDependency Class

Problemi correlati