[LINQ] Mapping esterno, intellisense e strategie di mapping
dops non è online. Ultima attività: 05/09/2008 13.59.03dops
Inserito il: 02 luglio 2008 12.11
796 messaggi dal 29 apr 2002 Istalla Microsoft Silverlight!
Ciao, mi stò sforzando nell'utilizzare linq to sql nonostante molti me lo sconsiglino vivamente (il solito problema del controllo sulle query lanciate pari a 0). Vorrei farlo comunque, ma nella maniera giusta. Innanzitutto facendo il mapping con un file esterno e non con gli attributi sulle classi. Ecco i primi dubbi: un file di mapping per ogni classe, un file di mapping che contiene tutta la struttura del database o un file di mapping che contiene la definizione del mapping per un certo datacontext ?
- Nel primo caso non saprei come istanziare la classe datacontext in quanto se nella classe mappata ho un membro che fà riferimento ad un altro tipo (es. proprietà "Profile" di tipo UserProfile nella classe UserAccount) il datacontext non conterrà il tipo UserProfile, quindi questo approccio è inutilizzabile. Immagino sia una soluzione improponibile..
- Nel caso di un solo file di mapping per tutto il database, si creerebbe come minimo un file grandissimo con probabile confusione e non sò se a livello di prestazioni cosa succede, non sò insomma se avendo tutti i tipi a disposizione nel datacontext cosa possa succedere.. si certo mi è chiaro che le query vengono eseguite in fase di recupero.. ho cmq qualche incertezza nell'approcciare questo metodo.. però mi sembra la strada + concreta e semplice da intraprendere visto che mappando con gli attributi sulle classi avrei lo stesso risultato (datacontext con tutti i tipi a disposizione). Vabbè ci sarebbe un altro piccolo problema, quello dell'architettura a moduli, se importo un nuovo modulo (assembly) nell'applicazione principale la cosa + logica da fare in termini di accesso ai dati sarebbe quella di creare i metodi di accesso in un namespace del modulo stesso.. questo significa creare almeno un file di mapping dedicato ai tipi del modulo..
- Nel caso di un file di mapping che contenga soltanto il mapping alle tabelle interessate, rischierei altra confusione e perdite di tempo (linq lo uso appunto per non perdere tempo) dovendo definire per ogni contesto le tabelle appropriate..
- Intellisense nei file di mapping: non c'è? non esiste un qualcosa che mi aiuti a creare i file di mapping? non parlo ovviamente dei tool che il framework mette a disposizione, tipo "sqlmetal".. aprire la console per creare un file di mapping mi fà perdere + tempo..
- Mapping per attributi sulle classi.. sarebbe una soluzione, ma sporcherei le classi.. il problema insomma che si sono posti i puristi dell'oop quando hanno fiutato l'avvento dei primi orm. Di sporcare le classi non me ne frega nulla.. però è anche vero che se scrivo mille classi con attributi linq ed un giorno decida di venderle, devo ripulirle tutte.. :D :(
Help.. che faccio? come ci si comporta con linq? che fate voi? mapping esterno o attributi sulle classi? In caso di mapping esterno, un file che contenga il mapping di determinate entità relazionate tra loro, un file per tutto il db o cosa? Grazie ;)

Modificato da dops il 02 luglio 2008 12.12 -

Microsoft Most Valuable Professional
RE: [LINQ] Mapping esterno, intellisense e strategie di mapping
nostromo non è online. Ultima attività: 05/09/2008 23.26.40nostromo
Inserito il: 02 luglio 2008 15.50
contributi / Top Poster / Community manager / www.soluzioni4d.it / Blog / 12053 messaggi dal 18 feb 2004 Istalla Microsoft Silverlight!
per prima cosa, attributi, il file esterno è li ma la sua utilità è tutta da dimostrare, io ci sto provando da tempo senza risultati apprezzabili.

sullo sporcare le classi, bhaa non credo, l'attributo è li, se nessun lo legge è inerme completamente inattivo, è solo un metadato.

se non vuoi usare SqlMetal, l'unica alternativa è il designer integrato.

direi di fare un unico DataContext.

ricorda che Linq To Sql è valido finché la struttura del tuo Domain Model corrisponde 1:1 a quella del db, ovvero una tabella/vista una classe

non ho capito il discorso del vendere le classi e della rimozione attributi.

per applicare la tua logica Business devi comunque eseguire l'ovveride di alcuni metodo del DataContext o usare i Partial Method, quindi rimani più o meno legato a doppia mandata a Linq To Sql

altra cosa, non è vero che non hai il controllo delle query che esegue, puoi sempre eseguire Stored procecure

ciao marco

Modificato da nostromo il 02 luglio 2008 15.51 -

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
RE: [LINQ] Mapping esterno, intellisense e strategie di mapping
dops non è online. Ultima attività: 05/09/2008 13.59.03dops
Inserito il: 02 luglio 2008 16.33
796 messaggi dal 29 apr 2002 Istalla Microsoft Silverlight!
Il discorso del vendere le classi era un esempio stupido inerente al fatto che se un altro sviluppatore usa le mie classi e magari non utilizza linq to sql si trova dei metadati inutili che appesantiscono il file .cs, ma sei stato abbastanza chiaro quando dici che l'attributo è lì e se nessuno lo legge è inattivo (ma appesantisce il file cs (lo sò lo appesantisce di un niente)) :D

Mi sà che se utilizzo gli attributi sulle classi un unico datacontext è d'obbligo.. o sbaglio?

Non ho capito quando dici:
"ricorda che Linq To Sql è valido finché la struttura del tuo Domain Model corrisponde 1:1 a quella del db, ovvero una tabella/vista una classe "
Cosa vuoi dire? se uso il pattern domain model la struttura è 1 entità per 1 tabella/vista no? poi ovviamente ci sono le classi di bl e dal .. ma forse non ho capito cosa vuoi dire.

Un'altra cosa che non ho capito:
"per applicare la tua logica Business devi comunque eseguire l'ovveride di alcuni metodo del DataContext o usare i Partial Method, quindi rimani più o meno legato a doppia mandata a Linq To Sql"
proprio non ho capito.. io immagino questa situazione: ho una entità cliente che è mappata su una tabella cliente, voglio tutti i clienti quindi creo un metodo in una classe statica (dal) dove a scope method istanzio la classe DataContext, a questo punto ho il tipo cliente nell'istanza datacontext ed eseguo la query con linq to sql.. cosa vuoi dire cone "devi eseguire l'override di alcuni metodi del datacontext" ?

Si certo, ci sono anche le stored procedure, ma così allora non si finisce mai..!! :D t-sql, linq.. troppe cose :D

Un'altra cosa che non riesco a capire.. con linq to sql come si gestiscono le associazioni? o meglio, come si disegna una classe con associazioni?.. uhm.. esempio (stupido e magari sbagliato):

public class Auto
{
private Ruota ruota = null;
}
public class Ruota
{
private int id = 0;
private string marca = null;
}

La classe auto contiene un riferimento alla classe Ruota, con NHibernate è corretto definire un campo del tipo Ruota nella classe Auto, con linq to sql và bene lo stesso o la classe Auto deve fare riferimento alla ruota con un campo intero tipo:

public class Auto
{
private int ruota = null;
}

lo sò è un esempio stupido ma devo capire se linq to sql funziona come NHibernate e quindi capire se il mapping deve essere fatto come viene fatto in NHibernate..

Modificato da dops il 02 luglio 2008 16.34 -

Microsoft Most Valuable Professional
RE: [LINQ] Mapping esterno, intellisense e strategie di mapping
nostromo non è online. Ultima attività: 05/09/2008 23.26.40nostromo
Inserito il: 02 luglio 2008 16.54
contributi / Top Poster / Community manager / www.soluzioni4d.it / Blog / 12053 messaggi dal 18 feb 2004 Istalla Microsoft Silverlight!
in ordine:

mapping 1:1 il Domain Model non devo corrisponder affatto alla struttuta del db, esempio posso avere una classe, Marco che è spalmanta su 10 tabelle, anche se le tabelle sono n l'entità sarà 1, questo concetto in Linq To Sql non esiste.

metti di avere una classe CustomeDetils, con campi come nome, cognome via ecc ecc, per motivi vari ed eventuali, di dovere spalmare i dati su più tabelle, con Linq To Sql sarai obbligato a avere n entitità.

Logica Businesse, pensa di dover validare i valori di un entità, la cosa migliore è farlo prima dell'inserimento, quindi usando i partial method che il deisgner crea ad hoc puoi iniettare la tua logica business.

un altro esempio potrebbe essere il logging delle operazione, metti di dovere registrare le azioni compiute , tipo modifiche, inserimenti o gli errori ecc ecc, con il modello di sviluppo proposto da Linq To Sql devi utilizzare i Partial Method. ecco un esempio:


public partial class MyDataContext
{
    private static ILog _logger = LogManager.GetLogger("MyLogger");

    partial void DeleteNews(News instance)
    {
        //todo registrare event
    }

    partial void UpdateNews(News instance)
    {
        //todo registrare evento
    }

    partial void InsertNews(News instance)
    {
        try
        {
            ExecuteDynamicInsert(instance);
            TopSeed.AddNewsWebEvent.Raise(instance);
        }
        catch(Exception ex)
        {
            _logger.Error("errore");
            throw;
        }

    }
}


infine per le associazioni ci sono EntityRef per fare riferimento ad una entità (uno a uno) e EntitySet per la relazione uno a molti

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
RE: [LINQ] Mapping esterno, intellisense e strategie di mapping
dops non è online. Ultima attività: 05/09/2008 13.59.03dops
Inserito il: 02 luglio 2008 17.26
796 messaggi dal 29 apr 2002 Istalla Microsoft Silverlight!
nostromo ha scritto:
in ordine:

mapping 1:1 il Domain Model non devo corrisponder affatto alla struttuta del db, esempio posso avere una classe, Marco che è spalmanta su 10 tabelle, anche se le tabelle sono n l'entità sarà 1, questo concetto in Linq To Sql non esiste.

metti di avere una classe CustomeDetils, con campi come nome, cognome via ecc ecc, per motivi vari ed eventuali, di dovere spalmare i dati su più tabelle, con Linq To Sql sarai obbligato a avere n entitità.


Ah forse ho capito, bhè è cmq abbastanza remota questa possibilità.. non sò se con NHibernate si può fare, non mi è mai capitato di dover recuperare una entità con campi sparsi su + tabelle.. a te si? :D


Logica Businesse, pensa di dover validare i valori di un entità, la cosa migliore è farlo prima dell'inserimento, quindi usando i partial method che il deisgner crea ad hoc puoi iniettare la tua logica business.

un altro esempio potrebbe essere il logging delle operazione, metti di dovere registrare le azioni compiute , tipo modifiche, inserimenti o gli errori ecc ecc, con il modello di sviluppo proposto da Linq To Sql devi utilizzare i Partial Method. ecco un esempio:


public partial class MyDataContext
{
    private static ILog _logger = LogManager.GetLogger("MyLogger");

    partial void DeleteNews(News instance)
    {
        //todo registrare event
    }

    partial void UpdateNews(News instance)
    {
        //todo registrare evento
    }

    partial void InsertNews(News instance)
    {
        try
        {
            ExecuteDynamicInsert(instance);
            TopSeed.AddNewsWebEvent.Raise(instance);
        }
        catch(Exception ex)
        {
            _logger.Error("errore");
            throw;
        }

    }
}


Aspè.. ma questo avviene sempre quando crei il mapping con il designer (parliamo di dbml vero?) ? Nel senso che potrei benissimo crearmi i miei metodi e fare il logging prima della scrittura.. o non ho capito niente? :D


infine per le associazioni ci sono EntityRef per fare riferimento ad una entità (uno a uno) e EntitySet per la relazione uno a molti
ciao marco

Si stavo appunto vedendo.. questa cosa, mi era scappato EntitySet..
una curiosità:

  [Table(Name = "Role")]
    public class Role
    {
        //Fields
        
        private int id = 0;
        private EntityRef<UserAccount> userAccount = null;
        
        .....
        
        [Association(ThisKey = "accountId", IsForeignKey = true)]
        internal UserAccount UserAccount
        {
            get { return userAccount; }
            set { userAccount = value; }
        }

        .....


"ThisKey" dev'essere il nome del campo che fà da chiave straniera nella tabella Role?

Modificato da dops il 02 luglio 2008 17.28 -

Modificato da dops il 02 luglio 2008 17.28 -

Microsoft Most Valuable Professional
RE: [LINQ] Mapping esterno, intellisense e strategie di mapping
nostromo non è online. Ultima attività: 05/09/2008 23.26.40nostromo
Inserito il: 02 luglio 2008 17.33
contributi / Top Poster / Community manager / www.soluzioni4d.it / Blog / 12053 messaggi dal 18 feb 2004 Istalla Microsoft Silverlight!

Aspè.. ma questo avviene sempre quando crei il mapping con il designer (parliamo di dbml vero?) ? Nel senso che potrei benissimo crearmi i miei metodi e fare il logging prima della scrittura.. o non ho capito niente? :D


esatto, e lo sai perche lo do per scontato? perchè altrimenti fare il mapping a mano è un macello.

e nulla vieta di aggiungere tuoi metodi al DataContext.


per il significato this ThisKey di rimando a msdn, è sicuramente più precisa di me, ma mi sembra che la definizione che ne hai dato possa andare.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
RE: [LINQ] Mapping esterno, intellisense e strategie di mapping
dops non è online. Ultima attività: 05/09/2008 13.59.03dops
Inserito il: 02 luglio 2008 17.39
796 messaggi dal 29 apr 2002 Istalla Microsoft Silverlight!
ahh fai il mapping dal designer :D hehe ;) no sò, ho una certa avversione a questi strumenti.. chissà perchè.. eppure non è che sia un programmatore di vecchia data.. sai uno di quelli che ha iniziato con cobol hehe.. anzi.. sono alle prime armi ed ho iniziato con tools come dreamweaver, ma anche con questi tools non riuscivo ad usare tutte le feature.. non sò se conosci.. ricorda ancora i nomi.. i behavior per asp di dreamweaver :D.. mah, forse fà parte del mio carattere cercare di tenere tutto sotto controllo.. ma mi sono arreso all'orm :D hehehe..
cmq no, te lo assicuro, sei meglio dell'msdn, non ti dicono una cosa certa !!!
http://msdn.microsoft.com/it-it/library/system.data.linq.mapping.associationattribute.thiskey.aspx

Microsoft Most Valuable Professional
RE: [LINQ] Mapping esterno, intellisense e strategie di mapping
nostromo non è online. Ultima attività: 05/09/2008 23.26.40nostromo
Inserito il: 02 luglio 2008 17.56
contributi / Top Poster / Community manager / www.soluzioni4d.it / Blog / 12053 messaggi dal 18 feb 2004 Istalla Microsoft Silverlight!
anche a me piace tenere tutto sotto controllo, e ti assicuro che se segui il modello di sviluppo che propongono, ovvero inserire la propria logica business attraverso Partial Calss ed Partial Method, puoi farlo.

no dai meglio di msdn no, magari possono esserci degli errori ma solo perche è vastissima

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

Vai a:
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.


maltra - 811 pt
vladimiro - 562 pt
fabrica - 180 pt

Ultimi vincitori: fabrica, vladimiro, PeppeDotNet

Iscriviti anche tu e raccogli punti. Questo mese in palio VS 2008 + Windows Server 2008, ReShaper e 1 ebook!



COMMUNITY
ULTIMI MESSAGGI


IN EVIDENZA
MISC
Powered by .db Forums