Linq to SQL NON è un Active Record...

Negli ultimi giorni chissà quante volte l'ho letto, mo' mi sono stancato...:-)

Ripeto:
Linq to SQL non è un Active Record.
Linq to SQL è un ORM puro.

da Fowler:
"An object carries both data and behavior. Much of this data is persistent and needs to be stored in a database. Active Record uses the most obvious approach, putting data access logic in the domain object. This way all people know how to read and write their data to and from the database"

E ora veniamo a noi, ecco qualche concetto takeaway da memorizzare e studiare a casa:

1. L'Active Record definisce che la responsabilità del ciclo di vita di una entity è sulla entity stessa. In Linq to SQL la responsabilità è delegata al DataContext (come in un qualsiasi ORM che si rispetti). Nella implementazione di Caste.ActiveRecord infatti, tutte le entity derivano da una base comune che ha i metodi .Save(), .Insert(), etc. etc.

2. L'Active Record prevede che la struttura della classe che rappresenta la entity sia più o meno simile alla struttura del record sul db (e da dove verrebbe il nome allora?). In Linq to SQL ci si può scostare enormemente, riusciendo a mappare tranquillamente la many-to-one e il l'ereditarietà (non è possibile avere per adesso Composizioni di oggetti mappati, aka Component per i NHibernettiani)

3. Linq to SQL ha un wizard che parte dalla struttura del DB. Questo non lo fa di certo un Active Record. Al massimo si può dire che il wizard è (giusto un po...:-)) datacentrico. Ma (come ho già dimostrato ampiamente ai community days) con Linq to SQL si può partire dalla classe entity e mappare o con attributi o con file XML.

Quindi:
mancanza di mapping 1 a 1 con la tabella...
responsabilità delle CRUD operation non sulla entity, bensì sul contesto di persistenza....
stop così.


ps: Se poi da li passasse il buon Raf, vi direbbe che Linq to SQL è uno strumento per costruire DAL...
Ok Raf non siamo in disaccordo...ogni ORM serve a scrivere i DAL....va bene così? :-)

Print | posted on lunedì 26 novembre 2007 13.21

Feedback

# re: Linq to SQL NON è un Active Record...

left by Andrea Saltarello at 26/11/2007 14.44 Gravatar
Oddio, Fowler dice che "the essence of an Active record is a Domain Model in wich the classes matches very closely to the record structure of an undelying database". se questa è l'*essenza* di AR, continuo a pensare che Liq 2 SQL lo sia <g>

.A

# re: Linq to SQL NON è un Active Record...

left by Giancarlo Sudano at 26/11/2007 14.52 Gravatar
Eccolo! :-)
Andrea l'essenza di AR è che la responsabilità delle CRUD sia della entity stessa. E' quello il discriminante fondamentale.

Le entity di Linq to SQL non matchano "very closely" al db in quanto possono definire delle collection one-to-many, delle reference many-to-one, possono esprimere ereditarietà (Linq to SQL copre due delle tre strategie attualmente disponibili). Stiamo parlando di un vero e proprio grafo.
L'unica cosa che non copre è il component.

Concordi?

# re: Linq to SQL NON è un Active Record...

left by Raffaele Rialdi at 26/11/2007 23.52 Gravatar
Quando dico che è un DAL intendo che è rudimentale. Concordo che ogni ORM faccia anche da DAL ma un ORM con le palle (da tennis ovviamente) fa anche altro ;-)

Io voglio partire dal mio object model e non dal DB. E non è una questione di principio ma un framework che si basa profondamente su OOP non può essere sfruttato bene se non con mezzi OOP.
Quindi il modo più semplice è quello di partire dal mio Object Model e ... riempirlo con i dati che escono da Linq2SQL in attesa che arrivi qualche strumento più serio.
Mappare dotnet su dotnet concorderai che è un giochetto facile facile... meglio così che usare altri strumenti.

Linq2SQL è una gran cosa perché risolve il problema più grave di tutti: la differenza del type system tra SQL e .NET.
Quanto a Linq2Entities, aspettiamo con pazienza e se non arriva qualcosa di buono ... lo scriveremo :)

# re: Linq to SQL NON è un Active Record...

left by Gabriele Del Giovine at 01/12/2007 12.28 Gravatar
Ma in sostanza, chi è il buono è chi è il cattivo?
E non ci sta pure che i buoni possono fare parzialmente cattivi ed i cattivi parzialmente i buoni?
Comments have been closed on this topic.