2010-10-07 10 views
2

Comment utiliser LINQtoSQL avec le modèle de référentiel?LINQtoSQL, modèle de référentiel et chargement paresseux

Je suis nouveau à L2S et trouve que son chargement paresseux est un obstacle réel à l'utilisation du modèle repo.

En général, je pense au modèle référentiel comme celui-ci:

var myCustomer = null; 

using (var myRepo = new Repo()){ 
    myCustomer = myRepo.GetCustomerForCustomerId(123); 
} 

if(myCustomer.Orders.Any()){ 
//do something 
} 

Le problème, ne L2S tentative d'établir une connexion de données lorsque myCustomer.Orders est interrogé? Cela ne conduit-il pas à des problèmes d'accès à la base de données imprévisibles? Je veux dire, oui, je pourrais dire à mes pensions de vérifier les commandes à l'intérieur du repo en sachant que notre couverture de test complète vérifie que les développeurs n'appellent jamais une entité que nous n'avons pas chargée explicitement, mais je préférerais simplement chargement paresseux/persistance object-datacontext.

J'ai donc 4 options

  1. Créer des objets de domaine qui sont créées à partir des objets L2S - beaucoup de travail et maintainance
  2. Créer verisons dérivées de mon objet L2S qui rompent il lien (http: // www.codeproject.com/KB/linq/linq-to-sql-detach.aspx)
  3. Utilisez plutôt LLBLGenPro.
  4. appel à la sagesse des lecteurs de débordement de pile

Je vais avec 4 pour l'instant. Comment puis-je m'assurer que mes objets n'appelleront pas la base de données après la fermeture de mon dépôt?

Et oui, j'ai lu chaque question de pile qui parle de L2S et Repos et aucun d'entre eux ne répond à cette question.

+0

Je ne connais pas la réponse, mais j'ai l'impression que la couche L2S ou toute autre couche de langage fait souvent plus peur que résoudre des problèmes. Certaines personnes (moi inclus) se sentent ennuyées de ne pas savoir ce qui se passe dans les coulisses. – vulkanino

+0

@vulkanino, seulement quelqu'un qui n'a pas utilisé L2S pourrait dire quelque chose comme ça. Que préférez-vous, SQL brut? –

+0

oui, raw sql dans les procédures stockées de la DB, en effet. pas de code SQL dans les sources du programme. – vulkanino

Répondre

1

Parfois, est utile pour charger avec empressement les enfants d'une entité. Vous pouvez le faire avec DataLoadOptions.LoadWith qui indique à votre DataContext de charger automatiquement les enfants d'une entité lorsque l'entité parente est chargée.

Snippet du MSDN link above:

Northwnd db = new Northwnd(@"c:\northwnd.mdf"); 
DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Customer>(c => c.Orders); 
db.LoadOptions = dlo 

Vous pouvez également utiliser DataLoadOptions.AssociateWith pour personnaliser davantage le comportement du chargement automatique.

Questions connexes