Problème de compilation pour une mise à jour avec LINQ : readonly !
8 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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,
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.
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
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
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" <gilbert.tordeur@orange.fr> a écrit dans le message de
groupe de discussion : #SN1SYH1JHA.2656@TK2MSFTNGP05.phx.gbl...
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.
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
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
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
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
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
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 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
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
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
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
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
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" <gilbert.tordeur@orange.fr> a écrit dans le message de
groupe de discussion : Oz7YifJ1JHA.5772@TK2MSFTNGP02.phx.gbl...
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 ?
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 ?