Domanda

Sto cercando di applicare il modello di radice aggregato al mio dominio. Sto usando Entity Framework 4 con Poco Entity Generator.

Ho due entità: MailingTask Emaillog con una relazione da uno a molti. (MailingTask ha molti emaillog). EF4 genera una proprietà di navigazione su MailingTask:

public virtual ICollection<EmailLog> EmailLogs

All'interno del mio modello non voglio mai accedere direttamente agli emaillog, sempre tramite il suo genitore MailingTask. Questo è applicato da:

  • Avere solo un repository di MailingTask, quindi non posso interrogare direttamente la tabella Emaillogs.
  • Ottenere emaillog solo attraverso questa proprietà di navigazione.

A volte ho bisogno di contare il numero di emaillog per un mailingtask. Ciò si ottiene utilizzando LINQ sulla proprietà di navigazione:

mailingTask.EmailLogs.Count();

Ma questo esegue sul lato dell'applicazione (non sul server di database). (Ed è molto costoso poiché ho molti emaillog per un mailingtask.) Ho letto alcuni post su questo comportamento e sembra essere che le proprietà di navigazione EF4 non possano essere utilizzate come iqueryable (eseguite sul lato del database). Quando si accede a una proprietà di navigazione, EF4 carica tutte le voci con tutte le colonne in memoria e applica l'espressione LINQ in memoria. Per una dichiarazione Count (), questo fa molto male.

Credo che dovrò cambiare il mio modello per ospitare questa query specializzata (possibilmente aggiungendo un emaillogsrepository con abilità di query). Per me, sembra che EF4 non supporti molto bene il modello di radice aggregata. O forse mi manca qualcosa sul modello di radice aggregata e su come dovrebbe essere implementato per quanto riguarda EF4 ...

Qualcuno ha incontrato questa situazione ed è stato in grado di risolverlo? Nhibernate o un altro ORM lo supporta meglio?

Nessuna soluzione corretta

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