webForumDet fria alternativet

Entity Framework (lazy loading eller hämta färskt?)

.NET

28 svar · 1 469 visningar · startad av CatZ

Medlem sedan jan. 20022 440 inlägg
Frågan#1

Jag har en lista med entiteter, det i sig är ju inga problem :P min fundering är bara om det blir bäst att plocka ut den entiteten som är vald och lazy loada eller om jag lika gärna kan hämta en ny lista med under-entiteter?

för min del spelar det ingen roll, men det som är "snyggast" är ju roligast :)

Medlem sedan aug. 20003 575 inlägg
#2

Jag vet inte hur EF fungerar med med lazyloading, men har det inget stöd för lazyloading kan du ju göra så att du kan anropa EF från den property som du vill ha lazyloading på för att hämta listan, dock så kopplar du samman ditt domänlager hårt mot EF vilket inte alltid är önskvärt.

public IList<OrderLine> OrderLines
get {
if(this.orderLines = null)
{
this.orderLines = EF.GetOrderLinesByOrder(this);
}
return this.orderLines;
}
}

Jag tycker det nog är snyggast om man kan minska hämtningar från databasen och arbeta mot domänen så mycket som möjligt, dock så innebär detta att du styr hämtningar mindre.

Medlem sedan jan. 20022 440 inlägg
#3

det var lite knepigare än så. Jag hoppas verkligen att det finns bättre alternativ men såhär gör jag för tillfället iaf

using (Entities entities = new Entities())
{
	ObjectQuery<Entity> entity = entities.Entity;
	var entQuery = from e in entity
				  select e;
	foreach (Entity ent in entQuery)
	{
		ent.SubEntity1.Load();
		ent.SubEntity2.Load();
		ent.SubEntity3.Load();
		ent.SubEntity4.Load();
	}

	return entQuery.ToList<Entity>();
}

Ska väl tillägga att jag gör så för att jag vill kunna arbeta med mycket data under en lång period och sedan persistera allting på en gång.

Medlem sedan maj 20012 812 inlägg
#4

Catz skrev:

Jag har en lista med entiteter, det i sig är ju inga problem min fundering är bara om det blir bäst att plocka ut den entiteten som är vald och lazy loada eller om jag lika gärna kan hämta en ny lista med under-entiteter?

Jag förstår inte frågan riktigt, LazyLoading använder du för att inte hämta refererade collections samtidigt som du hämtar datan till ditt objekt. Eftersom du inte vet om du behöver den refererade datan och då finns det ingen anledning att hämta den.

I ditt fall så verkar det som du vill ha alla data direkt för att kunna bearbeta den och sedan persistera, så din kod verkar ju göra det du vill även om jag hoppas (för ms skull) att det finns smartare sätt än så i EF att få alla data på en gång.

- M

Medlem sedan jan. 20022 440 inlägg
#5

Njae, jag skulle helst slippa hämta allting direkt men lyckades inte sy ihop det så jag gjorde som ovan och tänkte att då struntar jag i all kommunikation med databasen förutom den enda gången och när användaren sparar.

Problemet eller jag vet inte om det är något problem men det är (100 * 500 rader) + (100 * 20 rader) + (100 * 20 rader) det kanske blir lite mycket att läsa in i minnet...?

Medlem sedan aug. 20003 575 inlägg
#6

Jag tycker inte det är farligt att ha mycket saker i minnet, frågan är bara hur många andra som arbetar mot databasen och hur kritiskt det är att informationen är färsk.

Tycker den datamängden du beskriver är ganska liten, men det beror ju förstås på vilken data du har i dina tabeller :).

Men som jag sa ovan, hur ofta uppdateras datan och hur kritiskt är det med uppdaterad data?

Medlem sedan jan. 20022 440 inlägg
#7

Informationen behöver inte vara färsk, det är inte förrän ändringarna är sparade som datan ska användas på på andra datorer samt i plc'n.

Datan i tabellerna är ganska liten egentligen. Lite doubles, decimals, bits och integers.

Medlem sedan jan. 20022 440 inlägg
#8

Tillägg: Det finns smartare sätt att hämta datan, jag behöver ju inte använda LINQ > Entities. Skulle kunna använda någon av de andra frågetyperna istället.

Medlem sedan jan. 20022 440 inlägg
#9

Nickemannen skrev:

Tycker den datamängden du beskriver är ganska liten, men det beror ju förstås på vilken data du har i dina tabeller :)

Följdfråga, ska det verkligen ta 1,5 sekund att databinda 500 rader med ca 20 kolumner i varje rad? Hur snabbt kan man få det i NHibernate? Det är ju bara tomma rader för tillfället..

Medlem sedan maj 20012 812 inlägg
#10

catz skrev:

Följdfråga, ska det verkligen ta 1,5 sekund att databinda 500 rader med ca 20 kolumner i varje rad? Hur snabbt kan man få det i NHibernate? Det är ju bara tomma rader för tillfället..

Nope, men du har kanske något event på din controll som triggas när du binder data till controllen och om det eventet körs 500 gånger så räcker det med att eventet tar 3ms för att du skall behöva vänta 1,5 sekunder...

- M

Medlem sedan jan. 20022 440 inlägg
#11

Jag antar att CellEndEdit skulle kunna ställa till det, ska testa.

Medlem sedan jan. 20022 440 inlägg
#12

Nja det verkar bara ta så lång tid att databinda... :/

Medlem sedan aug. 20003 575 inlägg
#13

Databinda till en grafisk kontroll?

Medlem sedan jan. 20022 440 inlägg
#14

Ja en datagridview, har ingen aning om varför det är så segt. Det var bra mycket rappare tidigare igår. Har trilskats fram och tillbaka utan att märka någon skillnad. Personligen tycker jag 1,5 sekunder är löjligt!

/Edit

En av sakerna jag gjorde sedan det blev långsamt var att sätta annan färg på varannan rad men det ska väl inte göra att det tar 1,4 sekunder längre tid? I princip så är det bara:

private void BindDetailControls(Entity entity)
{
    dgvChildControl.DataSource = GetChildControlData(entity.ID); //som IList
}
Medlem sedan juni 20008 205 inlägg
#15

CatZ skrev:

Ja en datagridview, har ingen aning om varför det är så segt.

Låter som att någon behöver en profiler...

Medlem sedan aug. 20003 575 inlägg
#16

Nickemannen skrev:

Databinda till en grafisk kontroll?

Okej, jag tycker inte man skall ha fyllandet av en datagridview som referenspunkt när du jämför ORM'er.

Grafiska saker kan ta mycket tid.

Medlem sedan jan. 20022 440 inlägg
#17

spango skrev:

Låter som att någon behöver en profiler...

Ja det skulle väl underlätta förståss, rekommendationer? Ants?

Medlem sedan jan. 20022 440 inlägg
#18

Hämta datan med Entity Framework 0,1 sek binda noll rader till datagridviewn 8sek... Helt horribelt!någonting har jag gjort tokigt :)

Ska se om jag hittar någon information om prestanda på datagridview. Jag antar att allting som autosize osv ska bort till att börja med.

Medlem sedan aug. 20003 575 inlägg
#19

CatZ skrev:

Hämta datan med Entity Framework 0,1 sek binda noll rader till datagridviewn 8sek... Helt horribelt!någonting har jag gjort tokigt :)

Ska se om jag hittar någon information om prestanda på datagridview. Jag antar att allting som autosize osv ska bort till att börja med.

Är du säker på att det är bindningen och inget annat?

Medlem sedan jan. 20022 440 inlägg
#20

Jag testade precis att ta bort min modell och lägga till den. Nu gick det hur snabbt som helst att databinda igen. Tyvärr tog jag bort varannan radfärg och lite också.

Min modell var korrupt och felaktig och egentligen skulle jag inte ha kunnat köra programmet alls. Ramverket har nog haft något cache:at någonstans.

Jag hade lite problem med modellen igår. Eller jag hade problem med subversion! Chefen kom in helt apropå och tyckte vi skulle ha två kolumner till i databasen och svn vägrade låta mig ta bort och lägga till modellen. Nu verkar det som om det fungerar i alla fall. Ska testa att sätta tillbaka autosize och annat nu.

396 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
120 ms — deklarationer (db)
132 ms — hämta statistik (db)
141 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)