| Alessandro Garlatti |
Promozione di un entity da base a derived class
Alle prese con Entity Framework.
Ho una base class Utente, strutturata per mantenere le informazioni di base di tutti gli utenti di una intranet aziendale (nome, cognome, username, ecc...) Una classe derivata da Utente la estende aggiungendo altre proprietà specifiche di una particolare situazione (diritti di accesso ad una particolare applicazione). La tabella (e di conseguenza il set nel context) Utenti viene popolata ogni qualvolta si aggiunga un utente, ma l'utente potrebbe venir "promosso" in un secondo momento, quindi mi ritrovo a dover fare aggiungere alla tabella (e classe) derivata un record, quando il record corrispondente nella tabella base esiste già. Se cerco di creare una nuova istanza della classe derivata, istanziandola con la chiave corrispondente all'oggetto esistente nella classe base, non posso poi aggiungere l'oggetto al set perchè violo l'integrità della primary key. Che fare? Ho già pensato di non derivare la classe, ma di lavorare con le Navigation Properties, ma soluzione "classe derivata" mi sembrava più carina... |
| Gianluca Carucci |
Re: Promozione di un entity da base a derived class
Potresti creare una nuova istanza della classe derivata, assegnargli le proprietà della entità base, aggiornare tutte le referenze con gli oggetti collegati, cancellare la classe base e salvare la nuova classe derivata.
La soluzione più "zozza" è aggiungere (con una stored procedure o una query esplicita, magari mappata su una funzione nell'EF) il record nella tabella derivata. A quel punto per l'EF hai effettivamente "promosso" l'entità base in derivata. l'EF scopre se una classe è base o derivata solo a runtime quando esegue la query. Gianluca |
| Lorenzo Moretti |
Re: Promozione di un entity da base a derived class
Ciao,
scusa...tu a un certo punto parli di "promozione" di un oggetto da un tipo all'altro. Se non ho capito male vorresti che questa "promozione" comporti un cambio di tipo (quindi una classe diversa). Ma con la strategia di mapping che hai scelto questo vorrebbe dire che l'ORM dovrebbe anche cambiare tabella per la parte "estesa" dei dati...mantenendo lo stesso ID? ma non rischia di fare a botte con il concetto di IdentityMap? E poi l'ORM come distingue i due oggetti (vecchio e nuovo) che ha in memoria con lo stesso ID?...temo non ne verrà fuori una cosa bella... Butto là un'idea...piuttosto che ereditarietà, non è che stiamo parlando piuttosto di uno "stato" (state pattern)? Quindi piuttosto modifico una proprietà che mi identifica le caratteristiche specifiche di una parte dell'oggetto? In questo modo invece che andare a cambiare i "tipi" dovresti solo cambiare un ID (una FK) perchè parliamo di un'associazione many-to-one...può essere? forse però non ho ben capito lo scenario complessivo...o forse non ho capito bene il problema...l'unica cosa che però sono sicuro "non mi torna" è il fatto di voler cambiare tipo in corsa con lo stesso ID... Ciao Lorenzo |
| Alessandro Garlatti |
Re: Promozione di un entity da base a derived class
Infatti il problema è proprio quello di cambiare "tipo" in corsa senza intaccare la consistenza del DB. Giustamente non ti torna... non torna nemmeno a me, per questo ho postato la domanda.
Riprovo a riassumere: ho un tipo base (Utente) ed un tipo esteso (UtenteOrdini), ma in realtà di tipi estesi ne avrò poi molti. Un utente può nascere come base (mero accesso alle funzioni comuni) per poi essere "promosso" ad altri ruoli. Le informazioni relative ai singoli ruoli stanno su tabelle diverse del DB (con FK sulla tabella base). La soluzione carina era quella di ereditare tutte le classi dei tipi estesi da quello base, ma funziona bene solo se l'utente nasce già esteso, non se viene esteso successivamente. Per ora ho risolto lavorando di associazione e non di ereditarietà. Se poi avrò un po' di tempo ci tornerò sopra e se troverò una soluzione la posterò. Intanto grazie a chi ha colto la sfida. |