none
Add n'est pas là pour ajouter un élément dans une table? RRS feed

  • Question

  • Bonjour,

    Fervent utilisateur d'ADO.NET je viens d'arriver dans une nouvelle société et l'on me dit "il faut que tu utilises Linq for SQL".

    Aussi ai-je un peu de temps pour me former (certains diront que je suis chanceux) et j'ai commencé à potasser des tuto ainsi que la doc MSDN.

    Fort de toutes mes lectures je décide de me lancer dans un mini projet de test de type Application Windows Forms, dans lequel je rajoute une base de données de services (.mdf tout simplement)

    Dans cette base je crée deux tables, une table Clients (id<Guid>, nom<nvarchar(50)>, prenom<nvarchar(50)>, tel<nvarchar(50>), une table Factures(fac_id<Guid>, titre<nvarchar(50)>, pht<nvarchar(50)>, client_id<Guid>)

    Puis je rajoute une contrainte sur Factures.client_id qui doit correspondre à Clients.id, update & delete on casacade.

    Jusque là tout va bien, j'ajoute ensuite un élément de type classes linq pour SQL à mon projet et je fais glisser mes deux tables sur la vue, la contrainte s'affiche aussi c'est magnifique.

    Première différence avec le tuto suivant, les noms pluriels sont restés pour les noms de classes, alors qu'à ce que j'avais compris VS était censé nommer les classes au singulier de mes tables pour être en adéquation avec les conventions.

    http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

    Second problème je n'ai pas la méthode add() sur mes "tables" depuis mon data context

     

    InitializeComponent();
    Linq1DataContext madb = new Linq1DataContext();
    Client monclient = new Client() { nom = "kilifu" , prenom = "pc" , tel = "06060606" , Facture = new System.Data.Linq.EntitySet<Facture>() { new Facture() { fac_id = new Guid(), pht = "20" , titre = "facture de test" } } };
    madb.Client.
    madb.SubmitChanges();
    Ne faites pas attention au pluriel ou non j'ai fait plusieurs essais et renommages.

     

    Comment faire alors pour ajouter mes données?

    Je travaille sous Visual Studio 2010 x64 Ultimate fr avec tous les composants installés

    Merci pour votre aide.


    Cya
    jeudi 15 juillet 2010 13:07

Réponses

  • Bonjour,

    L'insertion a bien lieu, mais pas dans la bonne base. En fait, votre base de données du projet est copiée dans un répertoire "bin\Debug". Cette la copie qui est utilisé par l'executable lorsque vous le lancez par Visual Studio.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    vendredi 16 juillet 2010 14:13
    Modérateur

Toutes les réponses

  • Bonjour,

    Il me semble que la plurialisation ne fonctionne uniquement avec l'outil en ligne de commande SqlMetal.

    Pour marquer une entité à ajouter, il faut faire :

    madb.Client.InsertOnSubmit(monClient);
    

    Pour information, si vous êtes en train de vous former à Linq To SQL, je vous conseille d'arrêter et de passer directement à l'Entity Framework. En effet, Linq To SQL est maintenu, mais n'évoluera plus au fil des versions...

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    jeudi 15 juillet 2010 13:48
    Modérateur
  • Bonjour,

    Merci pour votre réponse.

    J'avais déjà essayé avec cette méthode et je viens de réessayer en partant de classes Linq for SQL propres et les enregistrements n'apparaissent pas dans ma base.

    N'y aurait-il pas un truc tout bête de débutant que j'aurai pu oublier?

    Puisque vous me conseillez l'entity FrameWork j'aurait quelques questions à vous poser:

    - Quels avantages par rapport à Linq?

    - Est-ce qu'on peut l'utiliser aussi sur des IEnumerable comme Linq ? (quelque chose du genre ... maliste.where( l => l.nom == "toto")....)

    - Ceci est-il utilisable avec le modèle de données SharePoint?

    Merci pour vos réponses.

    Cordialement.


    Cya
    jeudi 15 juillet 2010 14:31
  • Bonjour,

    Quels avantages par rapport à Linq?
    Linq est un langage de requêtage (sur des bases SQL, sur des objets, sur du Sharepoint,...etc).

    Est-ce qu'on peut l'utiliser aussi sur des IEnumerable comme Linq ? (quelque chose du genre ... maliste.where( l => l.nom == "toto")....)
    Oui, l'Entity Framework offre un fournisseur Linq, appelé Linq To Entities

    Ceci est-il utilisable avec le modèle de données SharePoint?
    Qu'est ce que pour vous le modèle de données SharePoint ?

    Linq To SQL est la première implémentation de Linq pour les bases de données SQL. Cette technologie utilise uniquement SQL Server et gère des entités peu objets (limitation dans l'héritage, pas de relation n-n). Lorsque vous utilisez Linq To SQL (comme avec les DataSet), vous manipulez des objets de manière "relationnel". Vous ne pouvez donc pas utilisez la puisstance de l'orienté objet (héritage, relation n-n).

    L'Entity Framework est un mapping ORM très puissant (il permet différent héritages et les relations n-n). L'Entity Framework a été conçu pour être indépendant du fournisseur de la base de données. Microsoft propose le fournisseur pour SQL Server, mais vous pouvez téléchergez d'autres fournisseurs chez des éditeurs tiers.
    Au passage, l'Entity Framework devrait être la technologie unique d'accès aux données sur .NET, en effet Microsoft développe des technologies qui gravite autour de l'Entity Framework (ADO .NET Data Services et RIA Services, sont des bons exemples).

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    jeudi 15 juillet 2010 14:43
    Modérateur
  • Bonsoir,

    Alors si j'ai bien compris on peut faire du Linq sur les objets SharePoint 2010 (tels que les SPlist etc etc) car ce dernier a été développé en 3.5

    Pour ce qui est du Entity Framework, on ne peut l'utiliser qu'à partir de la version 4 et Linq, qui n'est qu'une syntaxe par abus de langage, a été porté dessus c'est ça?

    Mais du coup logiquement quand j'instancie une List<> sur un projet 4 et que je fais du Linq dessus je passe par l'Entity Framework exact?

    Par contre pour la même chose mais sur un projet en version 3.5 je passe par Linq for object.

    Je répète tout cela ici car je ne suis pas sûr d'avoir tout saisi, de plus s'il s'avère exact ce récap pourra être utile à d'autres débutants en Linq/Entity Framework comme moi.

    Une dernière question, comment se fait-il que même avec la méthode que vous m'avez conseillé à la place de Add() je ne voie pas mes enregistrements en db?

    Merci pour toutes vos réponses.

    Cordialement


    Cya
    jeudi 15 juillet 2010 21:16
  • Bonjour,

    Linq est un langage permettant de modéliser des requêtes objets (plus techniquement un arbre à Expression). Cette requête porte sur une source de données qui doit implémenter l'interface IQueryProvider. Il existe différente source de données qui implémente IQueryProvider (Linq To Entitites, Linq To Objets, Linq To XML, Linq To Sharepoint, Linq To MonWebService,...etc).

    Lorsque vous écrivez une requête Linq comme ceci :

    from e in sourceDonnées
    where e.Bière = 1664
    select e;
    

    Un arbre à Expression est crée et sera exécuté sur sourceDonnées au moment où vous parcourez le résultat de la requête. Si sourceDonnées utilise un IQueryProvider Linq To SQL ou Linq To Entities, il prend l'arbre et le converti en requête SQL texte utilisable pour les SGBD. Si sourceDonnées utilise un IQueryProvider Linq To Objet (par exemple si sourceDonnées est un tableau), un parcourt du tableau sera réalisé...

    Alors si j'ai bien compris on peut faire du Linq sur les objets SharePoint 2010 (tels que les SPlist etc etc) car ce dernier a été développé en 3.5
    Oui, un projet sur Codeplex existe pour çà. Il implémente un IQueryProvider permettant de requêter sur des objets Sharepoint. (http://linqtosharepoint.codeplex.com/)

    Pour ce qui est du Entity Framework, on ne peut l'utiliser qu'à partir de la version 4 et Linq, qui n'est qu'une syntaxe par abus de langage, a été porté dessus c'est ça?
    L'Entity Framework existe depuis le .NET Framework 3.5 SP1. Linq existe depuis la version 3.5.

    Mais du coup logiquement quand j'instancie une List<> sur un projet 4 et que je fais du Linq dessus je passe par l'Entity Framework exact?
    Non, vous passez par Linq To Object.

    Je répète tout cela ici car je ne suis pas sûr d'avoir tout saisi, de plus s'il s'avère exact ce récap pourra être utile à d'autres débutants en Linq/Entity Framework comme moi.
    Même les meilleurs ont été débutant...

    Une dernière question, comment se fait-il que même avec la méthode que vous m'avez conseillé à la place de Add() je ne voie pas mes enregistrements en db?
    Pouvez-vous montrer votre code modifié ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS Windows Forms - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    jeudi 15 juillet 2010 21:33
    Modérateur
  • Bonjour,

    Merci pour toutes ces réponses cela a beaucoup clarifié les choses.

    Voici le code:

    Linq1DataContext madb = new Linq1DataContext();
          Clients monclient = new Clients() { nom = "kilifu", prenom = "pc", tel = "06060606", Factures = new System.Data.Linq.EntitySet<Factures>() { new Factures() { fac_id = new Guid(), pht = "20", titre = "facture de test" } } };
          madb.Clients.InsertOnSubmit(monclient);
          madb.SubmitChanges();
    

    J'ai aussi hébergé une version compressée de la solution à cette adresse : http://rapidshare.com/files/407288462/Linq2.zip

    Merci pour votre aide.

    Cordialement


    Cya
    vendredi 16 juillet 2010 13:40
  • Bonjour,

    L'insertion a bien lieu, mais pas dans la bonne base. En fait, votre base de données du projet est copiée dans un répertoire "bin\Debug". Cette la copie qui est utilisé par l'executable lorsque vous le lancez par Visual Studio.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    vendredi 16 juillet 2010 14:13
    Modérateur
  • Bonjour,

    En effet il effectue une copie de la base, par contre cela m'intrigue.

    Pour mon ancienne société j'avais à réaliser des web applications sous visual studio 2008 et je n'avais pas ce comportement, les données entrées en début étaient visibles directement depuis l'onglet server explorer.

    La copie de base est-elle propre aux projets comportant du Linq, ou bien ce comportement de non copie de la base est-il propre à des projets de type web?

    Merci pour vos réponses.

    Cordialement.


    Cya
    vendredi 16 juillet 2010 14:48
  • Bonjour,

    Une copie des bases de données n'est pas effectuée avec les projets de type "Site web".

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    vendredi 16 juillet 2010 14:57
    Modérateur
  • Bonsoir,

    Super, merci pour toutes vos réponses elles m'ont beaucoup aidé.

    Cordialement.


    Cya
    dimanche 18 juillet 2010 21:30