En massa ifrågasättande om min person istället, vad har det med saken att göra?.
Det är ingen som ifågasätter dig som person, bara din kunskap inom området. Du har fått svar på ditt PM om mina förundringar.
Okej, jag skall bemöta dina påstående/argument..
För det första så är det ingen större skillnad hur ett DataSet och en ORMapper används för att fylla data. Båda hämtar data från databasen och lagrar dessa i objekt. ORMappern skapar specifika objekt för varje data, medans DataSet lagar datan i ett specifik object, dataRow.
Ska man använda O/R mappers måste den klara alla scenarion, annars är det ingen ide.
En ORMapper är perdefinition menat till att hantera så som att En tabell är Ett objekt, alltså det finns en direkt koppling mellan tabellen och objektet, detta gör den lämpligt att använda i vissa situationer medans direkt olämplig i andra. Alltså så använder man inte en ORMapper i alla lägen. Ex: Är man endast intresserad av att presentera data på en websida, så är en DataReader och en Repeater ett bättre och smartare val ur prestandasynpunkt, ur underhållssynpunkt och skalbarhetsynpunkt så kan en ORMapper vara bättre. Så nej en ORMapper måste inte kunna allt, då blir den mest generell och långsam som dataset.
ändå alltid hämtas upp ur databasen med en SELECT innan du kan ändra det,
Din syn på vad en ORMapper kan göra och inte göra är lite konstig, du påstår att man måste göra en SELECT för att göra en update. Ditt finns ORMappers som kan (precis som Jon sa) exekvera standard SQL rakt av om man önskar. Skulle jag ha behov av att köra en UPDATE utan att först göra en SELECT (typ A = A + 1, kommandot) så kan jag enkelt lägga till den funktionallitetn i min ORMapper, och vips så kan jag gör UPDATEN genom att skapa ett objekt, sätta ID = 19 och välja ett fält (kolumn) och sedan sätt en enum till Incresse. När jag sedan spara mitt objekt, så kommer min ORMapper finna ut att jag vill endast göra en incresse på ett fält till en tabel med ID = 19. Och då generera SQLkoden: UPDATE [kund] SET [Count] = [Count] +1 WHERE [Identifier] = 19, då fungerar min ORMapper på det sättet som du säger att den inte kan. Är det så att det inte är en räknar vi är uteefter utan endast uppdatera namet utifrån ID utan att ha presenterat datan, så kan man lösa det med att endast göra förändringar på fält som är ändrade, man tar alltså en snabbshot av hur datan såg ut ibörjan (typ allt är null) och sedan så jämför man med ur datan ser ut när man gör sin save och bygger en UPDATE sql sats utifrån det.
och de objekt du använde för att visa datagridet försvann vid postback, du måste helt enkelt ta upp värdet igen som användare ville ändra ur databasen
Hmmm... Okej säg nu att min ORMapper inte klara av att göra en UPDATE direkt. Jag läser först upp data till mitt objekt, visar data på sidan och sedan göra en postback. Varför skulle jag inte kunna lägga mitt objekt i Session och sedan använda det för att göra en save i min postback, eller som datasetet gör, lägga en serializerat objekt i viewstaten och sedan vid postbacken deserializera tillbaka mitt objekt och sedan göra en save. Så nej jag måste inte göra en SELECT igen för att hämta värdena, jag har valmöjligheten att göra det, eller att lägga objektet i en session, eller en egen cache, eller i viewstaten. Med ditt dataset så har du samma möjlighet att behålla data vid en postback.
En applikation där användaren ska spara lite text han skrivit, och detta utlöser en serie av underliggande reaktioner, saker som han inte ser, ska uppdatera 4 tabeller, men först ska dessa värden kalkyleras i applikationen, Och dessa värden som ska uppdateras som användare inte märker av måste ändå alltid hämtas upp ur databasen med en SELECT innan du kan ändra det, denna SELECT behöver inte göras om man inte använder O/R mappers
Nu förstår jag verkligen inte vad du menar, menar du att om man använder en ORMapper så måste man först hämta alla data med en SELECT och sedan använder man denna data för underliggande kod, och tillslut så uppdatera man i tabellerna. Jag kan inte se hur du skulle kunna lösa det på något annat sätt med ett DataSet, du måste hämta samma data som jag gör med min ORMapper eftersom den behövs vid beräkningarna. Möjligvis så menar du att man spara data till andra tabeller där man inte har hämtat data sedan tidigare och då påstår du att jag måste hämta datan med en SELECT först medans med ett DATASET så kan man göra en UPDATE direkt, så fall refererar jag till ovanstående text där den myten dog.
Det handlar ju inte om millisekunder.
Faktiskt så handlar det om millisekunder, allt beroende på hur din databas ser ut, men att lägga 1 miljon rader i en SQLdatabas är inget som den får skrämselhicka av, har jobbat med databaser som har haft upp mot 15 miljoner rader kod, och en rätt indexerad databas hämtar ut den datan på under sekunden, svårt att säga tid då QA inte har så bra tidsangivelse. Sedan är det också så att exekveringsplanen för en SELECT statement sparas så nästa gång så går det ännu fortare.
Tänk dig detta: En hierkisk databas, med 7 tabeller i rakt nedåtstigande led
Helst inte, hade prylat min dba om han hade gett mig en sådan databasstruktur...
Varje parent tabell har en trigger som triggar igång kaskader av UPDATE:s
och INSERT:s i SQL-servern. Om du caschar dina objekt, hur ska du kunna veta
vilka rader alla dessa triggers uppdaterade och la in värden i?. och vilka
de nya värdena blev?.
I det läget så kan du inte ha data cachade eftersom datan ändras utan för ORMappern vilket betyder att datan i ORMappern och datan i databasen inte kommer att vara samma. Lösningen är att låta ORMappern sköta det jobbet som trigger gör. Man skriver helt enkelt in kod i sina objekt som skall utföras som en trigger, på det visset så kommer den cachade datan vara samma som i databasen.
Det undrar mig dock att du tog upp det exemplet eftersom det knappast blir bättre med ett dataset, den datan som du har i datasetet är också inaktuell när triggersna slår igenom och man måste hämta datan igen, så varför exemplet?
Klart att det är en rejäl prestandaförlust när du måste selectera data ur
databasen för att kunna förändra dess värde. Istället för att gå direkt mot datakällan.
Definera en rejäl prestandaförlust och definera vad du skall göra med datan, om det är en weblösning, så ligger inte prestandahiten vid en select i databasen utan vid transport av data till och från klienten. Helt beroende på miljöer så kan det röra sig om skillnader på 100:1 alltså knappast lönt att lägga tid på att fixa, men som sagts tidigare det handlar om millisekunder för att hämta ut värde ur en databas.
Och ni säger att man då kan cacha sina objekt som lösning på problemet, men dessa objekt kan du inte
per automatik invalidera om datakällan förändrats (kommer först i ADO.NET2.0).
Återigen så ligger fokus på felställe, när Jon föreslog cachen så handlade det om slippa hämta data från databasen vid en postback, vilket du hävdare att man måste, vilket jag tog död på högre upp i texten. Om man använder sig av den cachade datan så behövs endast 1 SELECT, precis som med ett DataSet eftersom datan skall presenteras först. Skall det var så att datan inte skall presenteras först så har jag gett förslag på lösningar för att göra en UPDATE mot databasen direkt ovan.
Handlar det om en vanlig cache så kommer även ett DataSets data att bli inaktuell vid förändringar i databasen som inte går genom datasetet.
Förklara var jag hade fel i min förklaring hur en O/R mapper gör för att uppdatera ett värde i databasen.
Du hade inte fel, bara att du inte tagit med alla möjligheter, många ORMappers gör en SELECT - Ändra - UPDATE, bara att man inte måste det. Det går lika bara att: Ändra - UPDATE om man nu har den funktionallitetn i sin ORMapper eller skriver det själv.
Men som Jon sa: vad är du ute efter egentilligen, vill du använda DataSet så gör det, ingen tvingar dig till något annat. Du måste dock förstå att det finns en större värld utan för ditt fönster och alla kommer inte följa dina råd och vägar. I många projekt som jag varit med i så använder vi oss av webservices, och just till webservices så är dataset riktigt korkade att använda, då man tvingar klienten till att vara en .NET klient och i vår miljö så har vi flera olika plattformar: Java, notes, cobol... så där fungera en ORMapper ypperligt: Ladda ORMappern med data och sedan tar man ormapper.GetArray() så har man fått en array av objekt som vem som helst kan hantera och inte nog med det man får en objektorienterad lösning över webservicen på multiplaplattformar, inget som ett dataset klara av.
- Magnus