210 likes | 354 Views
LINQ to SQL käytännössä Kalle Launiala Konsultti ProtonIT Oy. LINQ to SQL käytännössä. Käyttöönotto käynnissä olevaan projektiin Tietokantatietoinen älykäs oliorakenne Työskentelyä tehostavat apuvälineet. Käyttöönotto projektissa.
E N D
LINQ to SQL käytännössä Kalle Launiala Konsultti ProtonIT Oy
LINQ to SQL käytännössä • Käyttöönotto käynnissä olevaan projektiin • Tietokantatietoinen älykäs oliorakenne • Työskentelyä tehostavat apuvälineet
Käyttöönotto projektissa • Yleinen pyrkimys jatkuvassa tiukan aikataulun projektissa tekemään myös elinvoimaisia ratkaisuja • Kova paine resurssien kasvattamiseen • Avainhenkilöt täysin ylikuormitettuja • Alustan joustavuus avainasemassa nopeissa määritysmuutoksissa
Lähtötilanne migraatiolle • Olio-relaatiomuunnin ei ole vaihtoehto sille ei ole vaihtoehtoa • Oma kokemus kehittäjän roolista alkaen VS.NET ja VS.NET 2003, käyttäjäksi VS 2005:n myötä • Käyttöönottopaine muodostui olemassaolevan rakenteen yli menevän toiminnallisuuden toteutuksesta Koko rakenne kerralla
... Lähtötilanne migraatiolle • Kasvu kahden pääkehittäjän tiimistä seitsemän kehittäjän tiimiksi • Kaksi kehittäjää jaetuilla alueilla SQL:ssä LINQ kerros, johon muut kehittäjät heti ja pääkehittäjät aikataulun salliessa • Edellytys: Tietokannan ”täytyi” olla siististi relaatiorakenteinen
Migraation toteutus • Oliorakenne luotiin yhteistyössä nykyisten pääkehittäjien kanssa • ”Pystymetsästä” projektiin • Tiedon eheyttä parannetaan jatkuvasti LINQ validoinnilla • ”Breaking even”, LINQ mallin kautta eheää dataa myös uusien kehittäjien toimesta
Puitteet migraatiolle • Haut LINQ:n läpi kuten vanhan SQL:n • Mikäli stopperi tulisi vastaan, voidaan aina käyttää vanhaa SQL:ää tarvittavin osin • LINQ pystyy käyttämään yhteisiä transaktioita Kutsuja voidaan konvertoida osissa • Olemassaolevat Stored Proceduret pystyvät palauttamaan LINQ olioita • IMultipleResult, jos paluuarvon tyyppi voi vaihdella
Migraation eteneminen • Kehitystä voidaan tehdä kahdella tekniikalla rinnakkain • Ei ole mielekästä konvertoida kaikkea kerralla; varsinkaan jo poistuvia osia • Uudet osat ja suuremmat muutokset LINQ:lla • LINQ tuo keskitetyn oliorakenteen myös muilta osin sovelluksen tueksi • Haasteena pitää eri osat synkronoituina
”Heti” realisoituneet hyödyt • Nopeammin ja varmemmin tehtävät kyselyt • Selkeästi vähemmän ”opps” kiroitus ja vastaavia testiajossa silmille pomppivia virheitä • Muistikokoelmien LINQ kyselyt • Järkevä raja tietokannan ja muistin välillä tehtäviin operaatioihin • Kannasta ei tarvitse väkisin tuottaa mahdollisimman helppokäyttöistä dataa
LINQ to SQL käytännössä • Käyttöönotto käynnissä olevaan projektiin • Tietokantatietoinen älykäs oliorakenne • Työskentelyä tehostavat apuvälineet
Olio-relaatiomuunnos • Todelliset hyödyt realisoituvat oliorakenteen kautta • LINQ on arvokas itsessään, LINQ to SQL erityisesti olio-relaatiomuunnoksen takia • ”Helmiä sioille”, jos sovellus täytetään upotetun SQL:n sijasta upotetulla LINQ:lla
Suuren oliojuhlan tuntua... • Oliolinkkien lazy loading ja relaatiot Tietokanta on kuten ”ääretön” jaettu muisti, jonka muutokset viedään transaktioissa • ... Kunhan tiedostaa mitä taustalla tapahtuu • Esim. ”leppoisat” domainrajat ylittävät haut (esim muistikokoelman ja SQL kokoelman joinit) ovat helposti turhankin leppoisia...
Ooh – lii – oo... • Loogisesti olioihin sijoittuva toteutus • Muutama rivi koodia oikeassa oliossa, joka voi viitata linkkien yli tarvittuun dataan • Ei luokkarajojen yli käpistelyä • Varmistaa myös, että saman asian toteutus useampaan kertaan minimoituu • Tarvekohtaiset kokonaisuudet extension metodien ominta aluetta
Järkevät rajaukset • Esim. Asiakas Tarjouksia Tuotteita • Ei toteuteta Asiakas – luokkaan tuotteita hakevia osuuksia, vaan toteutetaan ne tarjoukseen. Asiakas kyselee tarjouksiltaan. • Ydintoteutus yleiseen LINQ malliin, esim. Raportointi ja käyttöliittymäkohtaiset osuudet extension metodeilla • Extension metodit näkyvät kuten luokan metodit, kunhan assembly viite ja namespace ovat kohdallaan
Oliokohtaiset yleiset rutiinit • Yleiset haut kannattaa toteuttaa olioihin: public static Order GetOrder(long id) { return (from order in DBS.ActiveCTX.Orders where order.ID == id select order).FirstOrDefault(); } • Luonnit keskitetysti staattisilla Create(parent, requiredInfo) rakenteilla • Varmistaa myös uusien olioiden liittämisen datakontekstiin • LINQ datakontekstin partial kutsut mm: • OnCreated, OnLoaded, OnValidate
... Oliokohtaiset rutiinit • Omat laajennukset, esim IPreValidate • Kutsutaan SubmitChanges() yliajossa • Ei samoja rajoituksia kuin OnValidate:lla • Älykkäät cascade - operaatiot • Kaikki operaatiot olioilla, ei ID:illä • Relaatiot ja linkit toimivat myös uusien olioiden osalta • Validoinnit toimivat aukottomasti oliotasolla • ID viittaukset vain kun suorituskyky sitä vaatii
Keskitetty DataContext • Edellytys, jotta oliot voivat viitata samaan kontekstiin • Kaikki oliotasolla tapahtuvat muutokset/lisäykset kohdistuvat samaan kontekstiin ja transaktioon • Windows Clientissä static • Säikeillä kontrolloitu ja/tai [ThreadStatic] • ASP.NET:ssä HttpContext.Current (eli request) kohtainen • Static Dictionary<HttpContext, DataContext> (säiekontrolloitu access) • BeginRequest alustaa, EndRequest siivoaa pois
Kuoppien väistelyä... • Esim. isojen relaatioiden kanssa tarkkana; tulevat muistiin kerralla (tosin vain kerran) • Hyvä profiloida sovellusta, myös muistikokoelmien LINQ kutsujen osalta • Veikkaus että SQL Server vNext syö jo LINQ luokat konteksteineen suoraan palvelimeen • LINQ oliot eivät ole normaalisti serialisoituvia • ToJSON() voidaan toteuttaa extensiona • Vaatii reflektiolla assosiaatioiden pätkimistä
LINQ to SQL käytännössä • Käyttöönotto käynnissä olevaan projektiin • Tietokantatietoinen älykäs oliorakenne • Työskentelyä tehostavat apuvälineet
Tietokannan päivitys - Demo • LINQ mallin luonti suoraan XML:ään • Indeksien ja foreign key ehtojen tarkennukset partial luokkien attribuuteilla • Tietokannan rakenteen päivitys suoraan LINQ mallista