IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[WCF/Linq To SQL] mise à jour


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2004
    Messages : 157
    Par défaut [WCF/Linq To SQL] mise à jour
    Bonjour à tous,

    Je suis en train de passer du fwk 2.0 au 3.5 pour le développement d'application en remoting.

    J'ai vu que les nouvelles techno WCF et Link to sql était assez sympa pour faire cela.

    Je crée mes BusinessObject genre User, Groupe, UserbyGroup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        [System.Data.Linq.Mapping.Table(Name = "dbo.hab_users")]
        public class User
        {
            #region Properties
            private int _Ident;
            [System.Data.Linq.Mapping.Column(Storage = "_Ident", Name = "Ident", DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true, CanBeNull = false)]
            public int Ident
            {
                get { return _Ident; }
                set { _Ident = value; }
            }
     
            private string _FullName;
            [System.Data.Linq.Mapping.Column(Storage = "_FullName", Name = "FullName", DbType = "char(60)", CanBeNull = true)]
            public string FullName
            {
                get { return _FullName; }
                set { _FullName = value; }
            }
    ...
    J'ai hérité la List<User> en lui ajoutant un datacontext. pour pouvoir faire les savechange...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     public class UserList : List<User>
        {
            private System.Data.Linq.DataContext _Datacontext;
     
            public System.Data.Linq.DataContext Datacontext
            {
                get { return _Datacontext; }
                set { _Datacontext = value; }
            }
    ...
     
            public static UserList SelectAllUsers()
            {
                System.Data.Linq.Table<User> Users;
                UserList lsUsrLst = new UserList();
     
                lsUsrLst._Datacontext = new System.Data.Linq.DataContext(@"Data Source=MonPC\SQLEXPRESS;Initial Catalog=TestWCF;Integrated Security=True");
                Users = lsUsrLst._Datacontext.GetTable<User>();
     
     
                var vQuerryUser = from oUsers in Users
                                  select oUsers;
     
                lsUsrLst.AddRange(vQuerryUser.ToList());
     
                return lsUsrLst;
            }
     
    ...
     
            public void SaveChange()
            {
                this._Datacontext.SubmitChanges();
            }
     
            public void CancelChange()
            {
                this._Datacontext.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, this); 
            }
     
            public void Refresh()
            {
                this.SaveChange();
                this._Datacontext.Refresh(System.Data.Linq.RefreshMode.KeepChanges, this);
            }
    Pour mon interface WCF.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     [ServiceContract()]
        public interface IHabFactory
        {
            [OperationContract()]
            BusinessOjbects.HAB_Objects.UserList SelectUserByLogin(string strLogin);
     
            [OperationContract()]
            BusinessOjbects.HAB_Objects.UserList SelectAllUsers();
        }
    Vous aurez compris que dans ma classe HabFactory, je ne fait que return UserList.SelectAllUsers(); ...

    Tout ce petit monde étant exécuté par un service Windows.

    Coté client, J'ai une form login qui lance les instructions suivantes lorsque l'on clique sur valider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    System.ServiceModel.ChannelFactory<IHabFactory> myChannelFactory = null;
                    IHabFactory myService;
                    myChannelFactory = new System.ServiceModel.ChannelFactory<IHabFactory>("ConfigurationHttpUser");
                    myService = myChannelFactory.CreateChannel();
                    BusinessOjbects.HAB_Objects.UserList usrLst = myService.SelectUserByLogin(ucLoginPannel1.LoginValue);
     
                    if (usrLst!= null && usrLst.First().Connect(ucLoginPannel1.PasswordValue)) // Connect est une methode de User qui decrypte le mot de passe et le vérifie puis met a jour certain champs.
                    {
                        System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(usrLst.First().PreferedLanguage.Trim()); // la langue de l'application change comme il faut.
     
    usrLst.SaveChange();
    ...
    et au SaveChange() j'ai une Exception object not set... mon Datacontext est null.

    Est ce que vous pourriez m'éclairer sur la marche a suivre dans ce genre de cas? ou tout du moins une piste.

    A savoir que j'ai dans l'idée de faire une interface WCF par groupe de businessobjet
    ex:
    Hab* : gestion utilisateur....
    Sys* : gestion Message d'erreur, ...
    Bo* : Objet de l'applicatif...

    Pensez vous que c'est une solution viable?

    Merci d'avance

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Ben c'est normal, ton context n'existe plus..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private System.Data.Linq.DataContext _Datacontext;
    Comment tu veux retrouver le context alors qu'à priori chaque requête va créer une nouvelle instance de UserList. (A moins que tu n'ais mis un instance mode différent)

    Faut tout refactorer en fait.

    Faudrait déjà voir le paramètrage des services (app.config ou autre, client et serveur).

    Après regarder comment l'implémenter.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2004
    Messages : 157
    Par défaut
    Merci pour ta réponse,

    Que veux tu dire par tout refactorer?

    Pour mes fichiers config rien de bien spécial.

    Coté server

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      <system.serviceModel>
        <services>
          <service name="ServiceFactory.HabFactory">
            <endpoint
                address="http://localhost:8018/HabFactory"
                binding="basicHttpBinding"
                contract="ServiceInterfaceFactory.IHabFactory" />
          </service>
        </services>
      </system.serviceModel>
    Coté client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      <system.serviceModel>
        <client>
          <endpoint
            address="http://localhost:8018/HabFactory"
            binding="basicHttpBinding"
            contract="ServiceInterfaceFactory.IHabFactory"
            name="ConfigurationHttpUser" />
        </client>
      </system.serviceModel>
    ps : pour être une peux plus claire.

    coté client.
    j'ai un projet de classe qui contient mes bo's.
    Un projet de classe contenant mon interface WCF.
    Un projet WinForm qui utilise ces bo's.

    Coté serveur
    j'ai un projet de classe qui contient mes bo's.
    Un projet de classe contenant mon interface WCF.
    Un projet de classe contenant ma classe wcf
    Un projet service windows qui utilise tout ça.

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Dans ton cas prècis, ton service que je n'ai pas vu, je n'ai vu que l'interface, serait intéressant à voir aussi.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2004
    Messages : 157
    Par défaut
    J'imagine que mon problème viens aussi du fait que ma classe user n'a pas les balises [DataContract] et [DataMember].

    pour ce qui est de la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            public UserList SelectUserByLogin(string strLogin)
            {
                return UserList.SelectUserByLogin(strLogin);
            }
     
            public UserList SelectAllUsers()
            {
                return UserList.SelectAllUsers();
            }
     
            public void SaveChange(IMtxBusinessObject clsBo)
            {
                clsBo.SaveChange();
            }
    J'ai rajouté la notion de savechage pour chaque objet (Imtxbusinessobject étant une interface n'ayant que cette méthode et dont tout mes objets implémentent. (mon application cliente n'a plus qu'a appeler savechange avec l'objet mais le hic est que j'ai une exception me disant que user n'est pas connu et que je dois le faire connaitre.

    Si tu veux tout, le service windows est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    protected override void OnStart(string[] args)
            {
                try
                {
     
                    ServiceHost host;
     
     
     
                    this.HostList = new List<ServiceHost>();
     
                    host = new ServiceHost(typeof(ServiceFactory.HabFactory));
     
     
                    this.HostList.Add(host);
                    StartAllHost();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    ...
     private void StartAllHost()
            {
                try
                {
                    foreach (ServiceHost hst in this.HostList)
                    {
                        hst.Open();
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
     
            }
    ...

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Pour les balises, si tu es en SP1, pas de soucis.

    Flag ton service par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]

Discussions similaires

  1. Linq to Sql Mise à jour des Vues
    Par Muller Guy dans le forum Linq
    Réponses: 3
    Dernier message: 17/06/2010, 15h53
  2. [Linq to SQL] Mise à jour multi-contexte
    Par CLemTB dans le forum Linq
    Réponses: 0
    Dernier message: 17/12/2009, 17h36
  3. [Requête/SQL]Mise à jour table sans supprimer les relations
    Par atlantideD dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/04/2007, 14h53
  4. [PL/Sql]Mise à jour curseur de lecture
    Par lper dans le forum Oracle
    Réponses: 4
    Dernier message: 22/02/2007, 15h29
  5. [T-SQL] Mise à jour d'un champ classement
    Par Djerry dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 29/05/2006, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo