Fremmednøgletildeling i LINQ to SQL

Jeg har bakset lidt med en fejl, der opstod i forbindelse med opdatering af en LINQ to SQL-entity. Helt konkret drejer det sig om den lidet informative fejl: "Operation is not valid due to the current state of the object", som opstår i forbindelse med at jeg tildeler en værdi til en fremmednøgle i denne entity.

Setup'et

Jeg opererer med optimistisk samtidighed og et afkoblet datasæt, dvs. jeg læser objektet, lukker forbindelsen og skaber en ny forbindelse, når jeg skal opdatere data (et typisk scenarium for websites der involverer en bruger mellem læsning og opdatering). I forbindelse med selve opdateringer indlæser jeg først objektet (og beholder forbindelsen til databasen), opdaterer entity'objektet og opdaterer databasen. Jeg har altså gang i noget med at kopiere data fra entity over i et forretningsobjekt og tilbage igen ifm. opdatering.

Idet min entity læses sætter jeg nogle LoadOptions på forbindelsen, så relevante relaterede rækker fra andre tabeller også indlæses. Dette gøres af performancemæssige hensyn, da en reference til disse relaterede entities ville forårsage en "lazy loading" af data og dermed endnu et opslag i databasen.

Løsningen

Denne "eager loading" af relaterede data giver problemer, hvis jeg forsøger at opdatere fremmednøglen og ikke samtidig sætter det relaterede objekt til den nye entity (som nøglen også refererer til).

Jeg skal altså IKKE preloade relaterede tabeller, hvis jeg blot ønsker at benytte fremmednøglen til opdateringshandlinger.

Alternativt kunne jeg måske klare mig ved at benytte Attach i stedet for at læse entity inden opdatering. I dette scenarium ville der nok ikke ske en "eager load" af relaterede tabeller (jf. LoadOptions). Det har jeg dog ikke eksperimenteret med endnu...

Se også

http://www.faridesign.net/2010/11/linq-to-sql-operation-is-not-valid-due-to-the-current-state-of-the-object/

Comment