2009-01-13 8 views
2

Simplement tremper mes orteils dans le projet Linq2sql après des années de rouler mes propres routines d'accès DB SQL Server. Avant de passer trop de temps à essayer de faire en sorte que linq2sql se comporte comme mon code habituel, je veux vérifier qu'il ne soit pas déjà "construit" dans le comportement que je puisse utiliser en le configurant les bonnes relations dans le concepteur ...Linq2sql peut-il le faire sans beaucoup de code personnalisé?

exemple très simple:

J'ai deux tables: personne et notes, avec une relation 1 à plusieurs (1 personne, beaucoup de notes), reliées par Person.ID- > Note.PersonID.

J'ai une procédure stockée (tous les accès aux données se font via des SP et je prévois de continuer) ce qui fait que le Link2SQL fonctionne un peu mieux pour moi.

sp_PersonGet (@ID int) qui renvoie le dossier de la personne et sp_PersonNotesGet (@PersonID) qui renvoie un ensemble de notes connexes pour cette personne.

Jusqu'à présent, si bon, j'ai un objet:

 
Dim myPerson As Person = db.PersonGet(pnID).Single 

et je peux accéder à mes champs: myPerson.Name, myPerson.Phone etc.


et je peux aussi faire un

 
Dim myNotes As Notes = db.PersonNotesGet(pnID) 

pour obtenir un ensemble de notes et je peux itérer à travers cette liste comme:

 
For Each N As Note In myNotes 
    (do something) 
Next 

tout cela fonctionne très bien ... mais .... Ce que je préférerais que si je l'appelle:

 
    myPerson = db.PersonGet(pnID) 

que je finis aussi avec une collection de myPerson.Notes que je peux itérer à travers .

 
For Each N As Note In myPerson.Notes 
    (do something) 
Next 

Fondamentalement, linq2sql aurait besoin d'appeler 2 procédures stockées chaque fois qu'un enregistrement de personne est créée ...

Est-ce faisable « hors des sentiers battus », ou est-ce que je dois coder autour pour moi-même?

Répondre

2

Il utilise des classes partielles. Vous pouvez ajouter votre propre propriété "Notes" à votre classe Person et l'initialiser dans sa fonction GETter. Ce serait mieux que de remplir les notes chaque fois que vous chargez un enregistrement de personne.

0

Je crois que vous pouvez le faire plus ou moins de la boîte, même si je ne l'ai pas essayé - je n'utilise pas de procédures stockées avec LINQ. Ce que vous devez faire est de changer les méthodes d'insertion/suppression/mise à jour de l'utilisation de l'exécution pour utiliser vos procédures stockées.Ensuite, vous créez une association entre vos deux tables d'entités qui créerait un EntitySet de Notes sur la classe Person et un EntityRef de Person sur la classe Notes. Vous pouvez configurer ceci pour charger automatiquement ou en utilisant le chargement paresseux.

Le seul petit problème, pour autant que je puisse le voir, est le passage de l'utilisation des méthodes générées à l'exécution à l'utilisation de vos procédures stockées. Je crois que vous devez les ajouter dans le contexte de données en tant que méthodes (en le déposant sur votre table à partir de l'explorateur de serveur dans le concepteur) avant qu'il soit disponible à utiliser à la place.

Questions connexes