34 messaggi dal 02 dicembre 2010
Avendo questo model,

http://img819.imageshack.us/img819/1120/corr2.png
seguendo sempre il patter repository, è corretta una cosa del genere

http://img826.imageshack.us/img826/2624/corr.png

o sbaglio qualcosa?
Beh, non fa danno

Dovrei capire bene la problematica di business che vuoi modellare, e in particolare il significato di Attività.

In generale vedrei meglio, al posto della relazione 1:n Attività -> Cliente un servizio GetClientiByAttività, così che tu possa magari introdurre anche criteri di ricerca aggiuntivi, che invece non puoi esprimere con la semplice proprietà "Clienti"

Ciao!
Marco
34 messaggi dal 02 dicembre 2010
Beh, la problematica è raggruppare i clienti a seconda del tipo di attività che svolgono. Quindi chessò attività1: Formazione sicurezza, attività2: Prevenzione incendi, attività3: Sviluppo impianti etc...

Ma te consigli di eliminare la relazione 1-n solo su model o anche sul database?
Su database hai una FK e deve restare :)

Sul Model, ripeto, dipende molto dal tuo contesto, in genere io le relazioni 1-n le metto solo nel caso di Aggregati (tipo Fattura - DettaglioFattura), mentre cerco di evitarle tra due entità che non fanno parte del medesimo aggregato.

Quindi, nel tuo caso, lascerei la relazione Cliente -> Attività e toglierei quella in senso opposto, ossia Attività -> Cliente.

La ragione è che gestire queste relazioni ha un costo, che però dipende molto dall'ORM che stai utilizzando. Nel caso di EF e entity NON POCO, questo costo rasenta lo zero. Se usi POCO o code-first, inizia ad essere un po' complicato manutenerle.

Es. Cliente1 ha AttivitàX, quindi AttivitàX ha Cliente1 nella sua collection di clienti.
Se scrivi Cliente1.Attività = AttivitàY (quindi cambi l'attività di quel cliente), se usi POCO devi gestirti manualmente la logica di rimozione dalla collection di AttivitàX e inserimento in AttivitàY, almeno finchè non torni a rileggere tutto da database. Il che può rappresentare un certo sbattimento.

Inoltre, se un giorno vuoi cercare i Clienti dell'attivitàX che hanno sede a Milano, comunque devi fare un servizio ad-hoc. Perciò non vedo grande utilità nello gestire la relazione bidirezionale.

Ripeto: questo è un ragionamento generale, ma non si esclude che per il tuo particolare caso abbia comunque senso.

Augh!
34 messaggi dal 02 dicembre 2010
ok afferrato.

sto usando Entity con POCO quindi se un giorno vorrò "cercare i Clienti dell'attivitàX che hanno sede a Milano" dovrò, correggimi se sbaglio, creare un metodo nell'interfaccia ICliente, e implementarlo poi nella sua relativa classe. Giusto?

Altra domanda già che ci siamo: ma se voglio ad esempio creare una combobox e buttarci dentro le attività io ho referenziato il progetto (vedi foto1) EntityFramework.

Il codice adottato è:

_attività = BB.GeMeCo.ApplicationContext.Current.Attività;
cboAttività.DataSource = _attività.GetAll();
cboAttività.DisplayMember = "Descrizione";
cboAttività.ValueMember = "Id";


però poi quando vado a fare

(int)cboAttività.SelectedValue io vorrei che mi ritornasse un int con l'id della cbo attualmente selezionato invece mi da solleva una invalidcastexceptio perchè infatti il valore è una roba tipo
{System.Data.Entity.DynamicProxies.Attività_0BC37CBCE1F2EE5AE1E32AD07C207F64D3CB9CF7FC27AE1F1D05E412D1B9B2FA}
    base {BB.GeMeCo.ObjectModel.Attività}: {System.Data.Entity.DynamicProxies.Attività_0BC37CBCE1F2EE5AE1E32AD07C207F64D3CB9CF7FC27AE1F1D05E412D1B9B2FA}
    _entityWrapper: {System.Data.Objects.Internal.EntityWrapperWithRelationships<System.Data.Entity.DynamicProxies.Attività_0BC37CBCE1F2EE5AE1E32AD07C207F64D3CB9CF7FC27AE1F1D05E412D1B9B2FA>}
    Clienti: {System.Data.Objects.DataClasses.EntityCollection<BB.GeMeCo.ObjectModel.Cliente>}
    Descrizione: "Formazione tecnica"
    Id: 2
    RelationshipManager: {System.Data.Objects.DataClasses.RelationshipManager}



Sbaglio a creare il datasource su AttivitàRepository? Dovrei farlo da .ObjectModel?

Come vedi sto usando pari pari il progetto delle modelle ma solo a scopo di studio eh
34 messaggi dal 02 dicembre 2010
scusami Cradle se insisto ma alla domanda precedente ne aggiungo un'altra.

mettiamo voglia un form con una DataGridView con Id e Nome Cliente e a destra delle txtbox con i campi della tabella.
Per farlo io ho aggiunto un datasource del progetto EntityFramework della classe ClienteRepository->CurrentObjectSet impostato a Details così che lui mi ha creato tutte le txt.
Nell'evento selectionchange della datagridview ho messo

.currentObjectSetBindingSource.DataSource = cliente.GetById(id);

e infatti funziona tutto.

Domanda: ma il datasource della datagridview con cosa lo devo bindare? Perchè attualmente non è bindato a niente bensì riempito con un "cliente.getAll()" ma ovviamente se cancello un cliente non si aggiorna!

Altra domanda più di concetto: ma facendo una prima volta "cliente.getAll()" e poi ogni volta che scorro le righe del datagridview "cliente.getById(id)" Entity Framework quante letture del Database effettua? Una sola recuperando tutti i dati e lavorando con quelli salvo poi ritornare a scrivere sul database quando si fa un "SubmitChanges" oppure ogni volta torna a leggere la riga specifica del DB?

Non so se sono stato chiaro...
Grazie
Modificato da MaxDembo81 il 31 gennaio 2011 08.11 -
Ciao, andiamo per ordine:

1) Se hai bisogno di cercare i clienti di una data provincia, puoi ad esempio prevedere un servizio che internamente usa il repository per restituire questo dato. In alternativa puoi esporre questo metodo dal repository dei clienti, come una sorta di ricerca predefinita, non sarebbe più un repository nel senso stretto del termine, ma può andare comunque bene.

2) Strano che tu riceva quell'errore, soprattutto perchè in (int)cmbAttività.SelectedValue non c'è nulla di correlato ad EF. Potresti mostrarmi con esattezza il codice sotto accusa?

3) Il terzo punto non è chiaro: non capisco in particolare perché devi fare la getbyId del cliente se hai già caricato tutti i clienti in memory e quale risultato vuoi raggiungere.

Marco
34 messaggi dal 02 dicembre 2010
1)ok

2) avevo fatto casino io

3)voglio una datagridview con id cliente e ragione sociale e accanto per ogni record del db una textbox che me lo visualizzi il tutto utilizzando dei bindingsource!
ma non so il binding source su cos farlo, sull'object model, sul repository, sull'irepository :S

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.