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

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jérémy Jeanson
Le #19331041
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
Gilbert Tordeur
Le #19332121
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
Patrice
Le #19332971
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" 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



Jérémy Jeanson
Le #19333321
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
Gilbert Tordeur
Le #19333311
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
Jérémy Jeanson
Le #19333701
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
Patrice
Le #19334191
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" 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



Gilbert Tordeur
Le #19335451
Merci à tous deux et bonne soirée,
Gilbert
Publicité
Poster une réponse
Anonyme