Le contexte :
Je travaille sous Visual Studio 2008, en C# avec le FrameWork 3.5,
Silverlight 2 et SQL Server 2005.
Je tente d'utiliser le composant "DataGrid" de Silverlight pour afficher des
données d'une base.
L'accés à la base se fait via LinqToSQL.
Pour celà il faut créer un service WCF.
Le problème :
J'ai crée une fontion du service WCF qui interroge la base. Elle marche.
Le soucis c'est que la fonction renvoie une List<NomTable>, et que de
l'autre Silverlight ne retrouve pas ses petits.
Si ma fonction retourne une List<string> ça marche très bien.
J'ai déjà changer la sérialisation de la classe générée par LINQToSQL à
Unidirectionnal.
Mais ça ne change rien. Que faire ?
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 Cololi,
As tu bien vérifié que les entités que tu voulais faire passer via WCF avait leur propriété indiquées comme faisant partit du contrat de données attibuts DataContract pour les classes et DataMember pour leur propriérés ? -- Jérémy JEANSON MCP http://www.jjeanson.fr
Bonjour Cololi,
As tu bien vérifié que les entités que tu voulais faire passer via WCF
avait leur propriété indiquées comme faisant partit du contrat de
données attibuts DataContract pour les classes et DataMember pour leur
propriérés ?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
As tu bien vérifié que les entités que tu voulais faire passer via WCF avait leur propriété indiquées comme faisant partit du contrat de données attibuts DataContract pour les classes et DataMember pour leur propriérés ? -- Jérémy JEANSON MCP http://www.jjeanson.fr
Cololi
J'ai vérifié, ça y est bien , et je psen que c'est le fait de faire "Sérialisation : Unidirectionnal" qui fait ça :
Je précise que la classe ci dessous est dans le fichier généré par LinqToSQL et non dans le ficheir du service (ce qui n'empêche pas le service d'y accéder correctement, car j'y ai fait des requetes qui fonctionnent) :
[Table(Name="dbo.LANGUE")] [DataContract()] public partial class LANGUE : INotifyPropertyChanging, INotifyPropertyChanged {
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
[Column(Storage="_ID_LANGUE", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)] [DataMember(Order=1)] public int ID_LANGUE { get { return this._ID_LANGUE; } set { if ((this._ID_LANGUE != value)) { this.OnID_LANGUEChanging(value); this.SendPropertyChanging(); this._ID_LANGUE = value; this.SendPropertyChanged("ID_LANGUE"); this.OnID_LANGUEChanged(); } } }
"Jérémy Jeanson" wrote:
Bonjour Cololi,
As tu bien vérifié que les entités que tu voulais faire passer via WCF avait leur propriété indiquées comme faisant partit du contrat de données attibuts DataContract pour les classes et DataMember pour leur propriérés ? -- Jérémy JEANSON MCP http://www.jjeanson.fr
J'ai vérifié, ça y est bien , et je psen que c'est le fait de faire
"Sérialisation : Unidirectionnal" qui fait ça :
Je précise que la classe ci dessous est dans le fichier généré par LinqToSQL
et non dans le ficheir du service (ce qui n'empêche pas le service d'y
accéder correctement, car j'y ai fait des requetes qui fonctionnent) :
[Table(Name="dbo.LANGUE")]
[DataContract()]
public partial class LANGUE : INotifyPropertyChanging, INotifyPropertyChanged
{
private static PropertyChangingEventArgs emptyChangingEventArgs = new
PropertyChangingEventArgs(String.Empty);
[Column(Storage="_ID_LANGUE", AutoSync=AutoSync.OnInsert, DbType="Int NOT
NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
[DataMember(Order=1)]
public int ID_LANGUE
{
get
{
return this._ID_LANGUE;
}
set
{
if ((this._ID_LANGUE != value))
{
this.OnID_LANGUEChanging(value);
this.SendPropertyChanging();
this._ID_LANGUE = value;
this.SendPropertyChanged("ID_LANGUE");
this.OnID_LANGUEChanged();
}
}
}
"Jérémy Jeanson" wrote:
Bonjour Cololi,
As tu bien vérifié que les entités que tu voulais faire passer via WCF
avait leur propriété indiquées comme faisant partit du contrat de
données attibuts DataContract pour les classes et DataMember pour leur
propriérés ?
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
J'ai vérifié, ça y est bien , et je psen que c'est le fait de faire "Sérialisation : Unidirectionnal" qui fait ça :
Je précise que la classe ci dessous est dans le fichier généré par LinqToSQL et non dans le ficheir du service (ce qui n'empêche pas le service d'y accéder correctement, car j'y ai fait des requetes qui fonctionnent) :
[Table(Name="dbo.LANGUE")] [DataContract()] public partial class LANGUE : INotifyPropertyChanging, INotifyPropertyChanged {
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
[Column(Storage="_ID_LANGUE", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)] [DataMember(Order=1)] public int ID_LANGUE { get { return this._ID_LANGUE; } set { if ((this._ID_LANGUE != value)) { this.OnID_LANGUEChanging(value); this.SendPropertyChanging(); this._ID_LANGUE = value; this.SendPropertyChanged("ID_LANGUE"); this.OnID_LANGUEChanged(); } } }
"Jérémy Jeanson" wrote:
Bonjour Cololi,
As tu bien vérifié que les entités que tu voulais faire passer via WCF avait leur propriété indiquées comme faisant partit du contrat de données attibuts DataContract pour les classes et DataMember pour leur propriérés ? -- Jérémy JEANSON MCP http://www.jjeanson.fr
Jérémy Jeanson
Oups... pardon LinqToSql, j'ai égaré une paire de neurones au moment de répondre à ta question...
Attention à LinqToSql et les services + WCF : - dans un premier temps il ne faut pas compter sur les liaisons que tu peux avoir entre tes classes : EntitySet et EntityRef reisqueraient de te poser de très gros soucis côté client, il faut donc bien penser aux requetes que tu fais côté service.
- Ensuite (ce qui peut être ton souci) il faut éviter d'utiliser un IEnumerable<> en sortie, car celui-ci ne garanti pas que ta requête se soit exécute et que ce soit son résultat qui soit retourné... et donc côté client on peut avoir des erreur car forcément vu que le context LinqToSql est côté du serveur du service il n'existe pas côté client silverlight. à la place il est plus courant d'utiliser un tableau (vive la méthode ToArray() de Linq) en faisant ta conversion avec ToArray() tu serras alors certain que tes données on été énumérés. -- Jérémy JEANSON MCP http://www.jjeanson.fr
Oups... pardon LinqToSql, j'ai égaré une paire de neurones au moment de
répondre à ta question...
Attention à LinqToSql et les services + WCF :
- dans un premier temps il ne faut pas compter sur les liaisons que tu
peux avoir entre tes classes : EntitySet et EntityRef reisqueraient de
te poser de très gros soucis côté client, il faut donc bien penser aux
requetes que tu fais côté service.
- Ensuite (ce qui peut être ton souci) il faut éviter d'utiliser un
IEnumerable<> en sortie, car celui-ci ne garanti pas que ta requête se
soit exécute et que ce soit son résultat qui soit retourné... et donc
côté client on peut avoir des erreur car forcément vu que le context
LinqToSql est côté du serveur du service il n'existe pas côté client
silverlight. à la place il est plus courant d'utiliser un tableau (vive
la méthode ToArray() de Linq) en faisant ta conversion avec ToArray() tu
serras alors certain que tes données on été énumérés.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Oups... pardon LinqToSql, j'ai égaré une paire de neurones au moment de répondre à ta question...
Attention à LinqToSql et les services + WCF : - dans un premier temps il ne faut pas compter sur les liaisons que tu peux avoir entre tes classes : EntitySet et EntityRef reisqueraient de te poser de très gros soucis côté client, il faut donc bien penser aux requetes que tu fais côté service.
- Ensuite (ce qui peut être ton souci) il faut éviter d'utiliser un IEnumerable<> en sortie, car celui-ci ne garanti pas que ta requête se soit exécute et que ce soit son résultat qui soit retourné... et donc côté client on peut avoir des erreur car forcément vu que le context LinqToSql est côté du serveur du service il n'existe pas côté client silverlight. à la place il est plus courant d'utiliser un tableau (vive la méthode ToArray() de Linq) en faisant ta conversion avec ToArray() tu serras alors certain que tes données on été énumérés. -- Jérémy JEANSON MCP http://www.jjeanson.fr
Cololi
Le 1° point que tu soulèves, je ne le pige pas. Je parle de LinqToSQL et non de LinqToEntity.
Le 2° point : impossible j'ai fait un ToList() : Voici le code dans le fichier service, je vois pas où est le pb :/
namespace SilverlightApplication2.Web { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class LanguesService { [OperationContract] public List<LANGUE> DoWork() { DataClasses1DataContext db = new DataClasses1DataContext(); List<LANGUE> tmp = db.LANGUE.Select(l => l).ToList(); return tmp; } } }
(avec le debugger j'ai bien vérifié ... la requête se fait bien, c'est le service, qui ne reçoit pas les valeurs : problème qui ne se pose pas, quand la requete consiste à retourner une liste de string).
"Jérémy Jeanson" wrote:
Oups... pardon LinqToSql, j'ai égaré une paire de neurones au moment de répondre à ta question...
Attention à LinqToSql et les services + WCF : - dans un premier temps il ne faut pas compter sur les liaisons que tu peux avoir entre tes classes : EntitySet et EntityRef reisqueraient de te poser de très gros soucis côté client, il faut donc bien penser aux requetes que tu fais côté service.
- Ensuite (ce qui peut être ton souci) il faut éviter d'utiliser un IEnumerable<> en sortie, car celui-ci ne garanti pas que ta requête se soit exécute et que ce soit son résultat qui soit retourné... et donc côté client on peut avoir des erreur car forcément vu que le context LinqToSql est côté du serveur du service il n'existe pas côté client silverlight. à la place il est plus courant d'utiliser un tableau (vive la méthode ToArray() de Linq) en faisant ta conversion avec ToArray() tu serras alors certain que tes données on été énumérés. -- Jérémy JEANSON MCP http://www.jjeanson.fr
Le 1° point que tu soulèves, je ne le pige pas. Je parle de LinqToSQL et non
de LinqToEntity.
Le 2° point : impossible j'ai fait un ToList() :
Voici le code dans le fichier service, je vois pas où est le pb :/
namespace SilverlightApplication2.Web
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
public class LanguesService
{
[OperationContract]
public List<LANGUE> DoWork()
{
DataClasses1DataContext db = new DataClasses1DataContext();
List<LANGUE> tmp = db.LANGUE.Select(l => l).ToList();
return tmp;
}
}
}
(avec le debugger j'ai bien vérifié ... la requête se fait bien, c'est le
service, qui ne reçoit pas les valeurs : problème qui ne se pose pas, quand
la requete consiste à retourner une liste de string).
"Jérémy Jeanson" wrote:
Oups... pardon LinqToSql, j'ai égaré une paire de neurones au moment de
répondre à ta question...
Attention à LinqToSql et les services + WCF :
- dans un premier temps il ne faut pas compter sur les liaisons que tu
peux avoir entre tes classes : EntitySet et EntityRef reisqueraient de
te poser de très gros soucis côté client, il faut donc bien penser aux
requetes que tu fais côté service.
- Ensuite (ce qui peut être ton souci) il faut éviter d'utiliser un
IEnumerable<> en sortie, car celui-ci ne garanti pas que ta requête se
soit exécute et que ce soit son résultat qui soit retourné... et donc
côté client on peut avoir des erreur car forcément vu que le context
LinqToSql est côté du serveur du service il n'existe pas côté client
silverlight. à la place il est plus courant d'utiliser un tableau (vive
la méthode ToArray() de Linq) en faisant ta conversion avec ToArray() tu
serras alors certain que tes données on été énumérés.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Le 1° point que tu soulèves, je ne le pige pas. Je parle de LinqToSQL et non de LinqToEntity.
Le 2° point : impossible j'ai fait un ToList() : Voici le code dans le fichier service, je vois pas où est le pb :/
namespace SilverlightApplication2.Web { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class LanguesService { [OperationContract] public List<LANGUE> DoWork() { DataClasses1DataContext db = new DataClasses1DataContext(); List<LANGUE> tmp = db.LANGUE.Select(l => l).ToList(); return tmp; } } }
(avec le debugger j'ai bien vérifié ... la requête se fait bien, c'est le service, qui ne reçoit pas les valeurs : problème qui ne se pose pas, quand la requete consiste à retourner une liste de string).
"Jérémy Jeanson" wrote:
Oups... pardon LinqToSql, j'ai égaré une paire de neurones au moment de répondre à ta question...
Attention à LinqToSql et les services + WCF : - dans un premier temps il ne faut pas compter sur les liaisons que tu peux avoir entre tes classes : EntitySet et EntityRef reisqueraient de te poser de très gros soucis côté client, il faut donc bien penser aux requetes que tu fais côté service.
- Ensuite (ce qui peut être ton souci) il faut éviter d'utiliser un IEnumerable<> en sortie, car celui-ci ne garanti pas que ta requête se soit exécute et que ce soit son résultat qui soit retourné... et donc côté client on peut avoir des erreur car forcément vu que le context LinqToSql est côté du serveur du service il n'existe pas côté client silverlight. à la place il est plus courant d'utiliser un tableau (vive la méthode ToArray() de Linq) en faisant ta conversion avec ToArray() tu serras alors certain que tes données on été énumérés. -- Jérémy JEANSON MCP http://www.jjeanson.fr