webForumDet fria alternativet

O/R Mappers

.NET

20 svar · 993 visningar · startad av PDahlen

Medlem sedan apr. 2004778 inlägg
Frågan#1

I flera inlägg så har det sniffats på ämnet O/R Mappers, så jag tänkte öppna en ny tråd istället.

Det finns flera punkter som kan diskuteras:

  • Vad är en O/R Mapper
  • Hur använder man en O/R Mapper
  • Hur är en O/R Mapper uppbyggd
  • Hur bygger man en O/R Mapper

Och annat relaterat. Tror dock inte att vi behöver gå in på teorin bakom OOP och dylikt. Kan göras i andra trådar.

Medlem sedan okt. 2002188 inlägg
#2

Hej

För detta så hade en wiki varit helt underbar..

I nästan alla diskussioner om O/R-mappers så kommer detta dokument upp så här kommer det.. :)

Medlem sedan apr. 2004778 inlägg
#3

Ja, tyvärr så finns det ju ingen avdelning på susning.nu för O/R Mappers, men det kanske man i och för sig kan lägga upp en ny?

Det där dokumentet var intressant. Har säkert stött på det förut men nu sparade jag ner det för framtida läsning.

Jag har tidigare inte använt O/R Mappers men jag började idag.
Dock så använder jag det nog inte som ni andra. Jag använder Wilson ORMapper för att snabbt skapa mina grundläggande objekt från databasen.
I vissa fall så gör jag vissa tillägg i objekten. Sedan skapar jag mina egna collections och Business Logic. Jag vill ofta göra komplicerade frågor till databasen.
Men det är klart, eftersom jag inte använt O/R Mappers förut så kan jag säkert automatisera lite mer av arbetet. Särskilt med att skapa collection klasserna eftersom de ser likadana ut förutom att man får ändra typen på ett par ställen.

En fördel med Wilsons är i alla fall att man får med source-koden och kan göra vad man vill med den.

Medlem sedan jan. 20012 204 inlägg
#4

En annan gratis O/R mapper: http://sourceforge.net/projects/jcframework/

Medlem sedan okt. 2002188 inlägg
#5

Här är ett gäng till..

LLBLGEN Pro
DeKlarit
EntityBroker

Opensource..
NHibernate Alfa version.
OJB.net beta tror jag.. De har låst antalet funktioner i den..
OPF.net Färdig.. utveckling av andra versionen..
Sisyphus Fungerar inte... :/

Medlem sedan juli 20022 537 inlägg
#6

Skulle vara kul om någon av er som har byggt O/R Mappers kunde berätta mer om det.
Jag skulle uppskatta om någon svarade på punkterna PDahlen skrev i första inlägget.

Medlem sedan maj 20012 812 inlägg
#7

Vad är en O/R Mapper
Enkelt kan man säga att O/R Mappern är ett framework som spara/hämtar objekt till/från en relationsdatabas. Du slipper alltså själv skriva funktioner för att spara/hämta datan, det löser O/R Mappern åt dig.

Hur använder man en O/R Mapper
Det fungerar lite olika från O/R Mapper till O/R Mapper. Gemensamt är att man måste ha någon sorts mappning från din klass till din databas, så klassen vet vilket fält i databasen skall match vilken variabel i klassen: Vissa använder Attribute på variablern, andra använder Mapper-filer. Här kommer ett exempel med attribut:

public class User{

[DatabasFiled("FörNamn")]
private string myFirstName;

}

Nu kan O/R Mappern koppla ihop kolumnen "FörNamn" i din databas, men variablen myFirstName i din klass och fylla den med rätt data.

När man sedan vill skapa ett User objekt i din kod, så skriver så här (finns andra varianter med):

User user = (User) ORMapper.GetObjektById(typeof(User),1);

Nu har du hämtat ut en rad i databasen med id = 1 och fyllt ditt objekt user med denna informationen.

Hur är en O/R Mapper uppbyggd
Lite komplext att förklara här, men som jag sagt tidigare, så har jag skrivit ett exempel på hur en O/R Mapper kan vara uppbyggd, så bara sök i forumet så hittar du det nog.

Hur bygger man en O/R Mapper.
Se ovan. Sedan så går man ut på nätet och letar efter information, kollar på andra O/R Mappers hur de fungerar. Om du endast vill ha en O/R Mapper till dina projekt så ta en som redan finns, är du däremot intresserad hur de fungerar, så försök bygga en själv, det är inte så svårt och riktigt kul.

Sedan kan man givetviss bygga ut den i oändlighet, så den stödjer caching, COM+ Transactioner osv osv...

- magnus

Medlem sedan juli 20022 537 inlägg
#8

Tack för ditt svar Gladh!
Har du något tips på böcker?
Jag funderar på att införskaffa Professional ADO.NET with VB.NET och/eller Professional ADO.NET.

Medlem sedan juli 20011 304 inlägg
#9

Hur bygger man en O/R Mapper.
Vägarna dit är många och olika krokiga.
För min del har det gått till ungefär så här:

Först skapade jag ett ganska enkelt DAL.
Detta byggdes ut mer och mer och fick stöd för olika funktioner.

Sedan utökade jag mitt DAL så att det kunde läsa av attribut på mina klasser och generera sql-satser för att hämta data och fylla objekt. Detta såg jag som min första version av en mycket primitiv o/r-mapper.

Sedan Separerade jag mitt DAL från min o/r-logik.

Nästa steg var att börja fylla på med funktionalitet och optimeringar. Jag lade in stöd för
1-m, m-1 och m-m relationer,
implementerade en enkel cacheningsfunktionalitet,
ett criteria-objekt samt massa annat som hör hemma i en o/r mapper

Det jag gör nu är att förbättra alla funktioner som finns och försöker göra dem så bra som möjligt för det jag använder o/r mappern till

Min största uppgift just nu är att få till en så bra cacheningsfunktion som möjligt. :)

Jag förslår att man läser in sig på dessa områden och testar lite exempel på alla om man vill bygga sig sin egen mapper. Det finns ju som redan sagts massa olika sätt att bygga på. Ta hem de olika opensourcevarianterna och studera! Man kan få mycket inspiration!

Medlem sedan maj 20012 812 inlägg
#10

Skall du jobba mycket med ADO.NET så kan ju en bok vara bra, skall du syssla med O/R Mapper så är boken helt överflödig, eftersom du då "aldrig" i din kod kommer att använda dig av ADO.NET, detta är ju O/R Mapperns uppgift.

Min största uppgift just nu är att få till en så bra cacheningsfunktion som möjligt.

Jag fick mycket "inspiration" från MS Data Cache block.

- m

Medlem sedan feb. 200435 inlägg
#11

Boktips
I nedanstående bok finns det en del designmönster man kan ha nytta av. Jag tycker den värd att läsa.
http://www.amazon.com/exec/obidos/tg/detail/-/0321127420/qid=1082362862/sr=8-1/ref=pd_ka_1/103-0310943-7697470?v=glance&s=books&n=507846
Speciellt kapitel 11, 12 13 handlar om Objekt-Relationella mönster.

Om man fattar hur O/R mappers funkar och kan programmera kan man slänga ihop en VÄLDIGT enkel mapper från scratch på några timmar.
Vill man vill utveckla en "komplett" mapper som är kommersiellt gångbar bör man nog vara rejält erfaren och smart. Vidare får man nog lägga ner större delen av ett år för att få det riktigt bra. LLBLGEN Pro tog typ 8 månader av utvecklingsarbete att färdigställa.

Jag visar lite kod som kan hjälpa den som är nyfiken på hur man skapar ett objekt dynamiskt och fyller det med data från en databas.

Betrakta nedanstående som pseudokod!!!!!!!!!

//Anropas av Gladhs GetObjectById.
// OBSERVERA att det INTE är Gladh som är upphovsman till denna kod. 
//Jag har ingen aning om hur hans mapper funkar under ytan.
//readern hämtar info från db via en av dynamiskt skapad sqlfråga
//Properties innehåller de properties tillhörande typen 't' som ska mappas
//mappning innehåller indexen till det värde i readern som en viss
// property ska mappas mot (använder reader.GetOrdinal för att avgöra detta under ytan)
private object SkapaObjekt(Type t, IDataReader reader, 
			ArrayList properties, int[] mappning) 
{          
	object o = Activator.CreateInstance(t); 
	for(int i = 0; i < properties.Count; i++) 
	{ 		
		System.Reflection.PropertyInfo info = (System.Reflection.PropertyInfo)properties[i]; 
			                 
		info.SetValue(o, reader.GetValue(mappning[i]),null); 
	}
	return o;
}

Hoppas detta gick att förstå :-)

edit: Stavning = värdelös

Medlem sedan okt. 2002188 inlägg
#12

Är det någon som har testat Entity broker från Thona?

Thona

Medlem sedan juli 20011 304 inlägg
#13

Jag har testat den lite. Tyckte att det verkade vara en av de mest kompletta och komplexa jag har testat :)

Medlem sedan okt. 2002188 inlägg
#14

Hej

Tänkte testa den lite så fort jag får lite tid. Men har snöat in på NHibernate och jag tycker den är väldigt bra uppbyggd, bra uppbyggd kanske är fel, då det är svårt att få ett helhetsbegrepp om den fungerar. Men koden är väldigt snyggt strukturerad och lätt att förstå.. Trist att den inte fungerar fullt ut än.. Har för mig att entitybroker försöker kopiera en del saker som finns i Hibernate.. så om Nhibernate blir klar kan den förhoppningsvis bli riktigt bra..

Medlem sedan juli 20011 304 inlägg
#15

Det känns som om upplägget till sist handlar om personlig smak och tidigare erfarenheter. Jag har tittat på olika O/r mappers när jag har byggt min. Vissa tycker jag är bra på vissa saker och andra på andra saker. Har inte träffat på någon open source variant som jag gillar helt och hållet.

Det viktiga för mig är dels att det ska vara lätt att använda mappern som programmerare "mot den" och att det ska vara lätt att bygga ut och ändra den utan att behöva modifiera allt för mycket.

Medlem sedan okt. 2002188 inlägg
#16

Hittade en intressant blog om o/r-mappers

http://jaynathan.com/blog/archive/2004/06/23/150.aspx

Medlem sedan maj 20012 812 inlägg
#17

Stötte på en intressant sak i .NET 2.0 och Generics. Oftas har man en CollectionBase klass som man låter sina collections ärva ifrån.

I och med Generics så kan man inte bara byta ut sin CollectionBase rakt mot en CollectionBase<Type> eftersom detta blir problem i en O/R Mapper som inte vet vilken Typen är. Vilket gör att den lösning jag såg ser ut något sånt här:

Din egen Collection som ärver från en GenericsCollectionBase som i sin tur ärver från en CollectionBase.

i Din CollectionBase har du en AddObject(object o) method som är abstract och som implementeras i din GenericsCollectionBase där den sedan använder denna klass Add(<Type>o) method, typ något sånt här:

internal override AddObject(object o){
 Add(<Type>o);
}

Skall bli riktigt kul att bygga om min O/R Mapper till .NET 2.0 och Generics (när man nu skall få tid med det :( )

- Magnus

Medlem sedan apr. 2004778 inlägg
#18

När det gäller .net 2.0, har ni kollat något på Object Spaces? Som jag förstår det så är det i princip en O/R mapper.

Medlem sedan maj 20012 812 inlägg
#19

Nu har jag inte fördjupat mig i det, men som jag har förstått så är ObjectSpaces urtagen ur ADO.NET 2.0 för att implementeras i nästa verison. (bara något jag läste, har det inte bekräftat).

När jag väl får tid att titta mer på .NET 2.0 så lär jag kontrollera om ObjectSpaces finns eller ej, avgör om man skall skriva om sin egen OR Mapper eller inte.

- Magnus

Medlem sedan feb. 200435 inlägg
#20

Objectspaces kommer inte att vara en add-on till ado.net utom kommer att vara en av teknologierna i Longhorns winfs filsystem.
http://weblogs.asp.net/fbouma/archive/2004/05/22/139382.aspx
http://msdn.microsoft.com/data/objectspaces.aspx

280 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
153 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)