Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de compilation pour une mise à jour avec LINQ : readonly !

8 réponses
Avatar
Gilbert Tordeur
Bonjour,

Contexte = VS2008.
J'essaie d'écrire du code Linq pour mettre à jour un enregistrement en base
SQL Server :


Private ContexteFinance As FinanceDataContext
ContexteFinance = New FinanceDataContext(ObjSessionEtendu.OpenFinance)

' Ajout du fichier pdf en base de données (ou remplacement
' s'il existe déjà)
Dim MesPiecesJointes = From PiecesJointes In
ContexteFinance.CauDemandePieceJointe _
Where ((PiecesJointes.DpjNumDemande =
ObjSessionEtendu.Demande.NumDemande) _
AndAlso (PiecesJointes.DpjCodTypePieceJointe =
EjcCodTypePieceJointe.DemandeElleMeme)) _
Select PiecesJointes.DpjDatCreation _
, PiecesJointes.DpjDatMaj _
, PiecesJointes.DpjNomFichierPieceJointe _
, PiecesJointes.DpjNumAuteurCreation _
, PiecesJointes.DpjNumAuteurMaj _
, PiecesJointes.DpjNumPieceJointe _
, PiecesJointes.DpjSiPieceJointeZipee _
, PiecesJointes.DpjTxtPieceJointe

Dim SiExisteDeja As Boolean = False
For Each MaPieceJointe In MesPiecesJointes
SiExisteDeja = True
MaPieceJointe.DpjDatMaj = Now
Next

Le problème, c'est que Visual Studio souligne immédiatement l'instruction
MaPieceJointe.DpjDatMaj = Now
avec le message d'erreur La Propriété 'DpjDatMaj ' est 'ReadOnly'.

J'ai vérifié que ContexteFinance.ObjectTrackingEnabled = True, c'est bien
exact.

Alors je cale. Quelqu'un aurait-il une piste ?

Merci d'avance,
Gilbert

8 réponses

Avatar
Jérémy Jeanson
Bonjour Gilbert,

As tu regardé du côté de ta base de donnée si le champ correspondant à
DpjDatMaj n'avait pas une situation un peu particulière (genre mise
àjour automatique quand l'enregistrement était modifié) celà peut peut
être poser un souci.

Vu que tu sembles utiliser Linq To SQL, as tu regardé du côté du fichier
Vb que le designer créé pour toi. Dans vb il faut dans un premier temps
demander à l'explorateur de solution de t'afficher tout les fichiers et
ensuite tu veux consulter le fichier de code produit par le designer.
Cela te permettra d'avoir une meilleur idée de ce qui bloque si tu peux
voir comment la propriété DpjDatMaj est codée.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Gilbert Tordeur
Jérémy,

Point 1 : c'est seulement un champ datetime 8 Null autorisé. En fait j'ai
cité ce champ-ci, maus l'erreur apparaissait à tous les champs que
j'énumérais.

Point 2 : J'avais déjà regardé le code, toutes les propriétés avaient un
Set.

Je me suis demandé si cela dépendait du fait que la recherche n'était pas
faite sur la clé primaire, mais cela me paraît absurde.

Gilbert
Avatar
Patrice
Bonjour,

La mise à jour n'est pas possible avec une clause Select.

Le problème est que si l'on utilise la clause Select la lecture se fait via
un type anonyme qui ne dispose pas donc des règles de gestion utilisés sur
la classe contenant toutes les propriétés. Donc, dans ce cas la mise à jour
n'est pas possible.

Supprimer la partie Select et voir ce que cela donne. Si certains champs
sont volumineux utiliser l'option de "chargement à la demande" pour éviter
des les charger simplement pour modifier des champs élémentaires...

--
Patrice


"Gilbert Tordeur" a écrit dans le message de
groupe de discussion : #
Jérémy,

Point 1 : c'est seulement un champ datetime 8 Null autorisé. En fait j'ai
cité ce champ-ci, maus l'erreur apparaissait à tous les champs que
j'énumérais.

Point 2 : J'avais déjà regardé le code, toutes les propriétés avaient un
Set.

Je me suis demandé si cela dépendait du fait que la recherche n'était pas
faite sur la clé primaire, mais cela me paraît absurde.

Gilbert



Avatar
Jérémy Jeanson
Bonjour tout le monde,

Bien joué Patrice!
C'est ça, je n'avais pas vu le Select.

En effet quand on fait un select en choisissant ses champs on instancie
un objet hors du context. Cela ne viens pas du select ne lui même, mais
du fait de sélectionner des champs précis.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Gilbert Tordeur
Bonjour Patrice,

Merci pour ton intervention. Le fait d'enlever la clause Select a résolu le
problème.

Tu as bien vu le problème de performances, qui consiste à ne pas lire un
fichier pdf (ou autre) stocké en base. Comment mettre en oeuvre le
"chargement à la demande" ? Y a-t-il moyen de mettre ce champ à jour (celui
qui contient le pdf) sans l'avoir lu auparavant ?

Merci d'avance,
Gilbert
Avatar
Jérémy Jeanson
Bonjour Gilbert,

Il y a actuellement pas mal de débats sur le sujet et des rececherches
sur comment contourner le problème, mais rien n'est vraiment très avancé
actuellement.

Donc si on veut bien faire la méthode la plus simple semble être la
création d'une procédure stockées sur le serveur SQL et l'appel de
celle-ci via le context Linq to SQL.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Patrice
Outre la réponse de Jérémy, dans le concepteur LINQ to SQL, cliquer sur le
champ concerné et afficher les propriétés. Je ne sais plus quel est le nom
exact mais il y doit y avoir une "métapropriété" qui indique si la propriété
doit être chargée tout de suite ou uniquement lorsqu'elle est demandée.


--
Patrice

"Gilbert Tordeur" a écrit dans le message de
groupe de discussion :
Bonjour Patrice,

Merci pour ton intervention. Le fait d'enlever la clause Select a résolu
le problème.

Tu as bien vu le problème de performances, qui consiste à ne pas lire un
fichier pdf (ou autre) stocké en base. Comment mettre en oeuvre le
"chargement à la demande" ? Y a-t-il moyen de mettre ce champ à jour
(celui qui contient le pdf) sans l'avoir lu auparavant ?

Merci d'avance,
Gilbert



Avatar
Gilbert Tordeur
Merci à tous deux et bonne soirée,
Gilbert