2008-10-11 9 views
0

(désolé pour mon anglais) Par exemple, dans mon DAL, j'ai un objet AuthorDB, qui a un nom et un objet BookDB, qui a un titre et un IdAuthor.Quelles sont les meilleures pratiques pour créer une couche d'accès aux données pour un objet ayant une référence à un autre objet?

Maintenant, si je veux montrer tous les livres avec le nom de leur auteur correspondant, je dois obtenir une collection de tous les livres, et pour chacun d'eux, avec l'attribut IdAuthor, trouver le nom de l'auteur. Cela fait beaucoup de requêtes à la base de données, et évidemment, un simple JOIN pourrait être utilisé.

Quelles sont mes options? Créer un objet "personnalisé" contenant le nom de l'auteur et le titre du livre? Si c'est le cas, la maintenance pourrait devenir horrible.

Alors, quelles sont les options? Merci!

Répondre

0

Vous pouvez créer une vue dans la base de données qui a la jointure construit en elle et lier un objet à celui, par exemple AuteurBooksDB. Il ne crée pas trop de mal de tête de maintenance car la vue peut masquer les modifications sous-jacentes et reste statique.

0

Si vous pouvez séparer la requête de base de données de l'immeuble d'objets, vous pouvez ensuite créer une requête pour obtenir les données dont vous avez besoin. Puis transmettez ces données à votre constructeur et laissez-les retourner vos livres.

Avec LINQ to SQL, qui peut être fait aussi facilement que:

public IEnumerable<Book> AllBooks() 
{ 
    return from book in db.Books 
      join author in db.Authors on book.AuthorId equals author.Id 
      select new Book() 
         { 
          Title = book.Title, 
          Author = author.Name, 
         }; 
} 

La même chose peut être réalisé avec DataTables/DataSets:

public IEnumerable<Book> AllBooks() 
{ 
    DataTable booksAndAuthors = QueryAllBooksAndAuthors(); // encapsulates the sql query 

    foreach (DataRow row in booksAndAuthors.Rows) 
    { 
     Book book = new Book(); 
     book.Title = row["Title"]; 
     book.Author = row["AuthorName"]; 
     yield return book; 
    } 
} 
0

Merci beaucoup pour vos entrées.

En fait, nous essayons de garder la base de données des objets aussi près que possible des colonnes réelles de la table correspondante dans la base de données. C'est pourquoi nous ne pouvons pas vraiment ajouter un attribut 'author' (chaîne) à l'objet BookDB.

Voici le problème que je vois avec l'aide d'objets « Voir ». Dans la base de données, si le schéma doit être modifié pour une raison quelconque (par exemple: Dans la table Book, la colonne 'Title' doit être modifiée pour 'The_Title', comment pouvons-nous facilement connaître tous les objets 'View' qui doivent En d'autres termes, comment savoir quels objets doivent être modifiés quand ils font des requêtes qui utilisent plusieurs jointures?

Ici, puisque nous avons un objet AuthorsBooks, nous pouvons voir par son nom qu'il fait probablement un interroger les tables de livre et l'auteur. Cependant, avec des objets qui font 4 ou 5 jointures entre les tables, nous ne pouvons pas compter sur le nom de l'objet.

des idées? (Merci encore, c'est un excellent site!)

3

N'écris pas quelque chose de bogué, inef Ficace et spécialisée ... quand des outils fiables, efficaces et génériques sont disponibles. Gratuitement.

Sélectionnez un ORM. NHibernate, ActiveRecord, SubSonic, NPersist, LinqToEF, LinqToSQL, LLBLGenPro, DB4O, CSLA, etc.

0

Je vous suggère de jeter un oeil à Domain Driven Design. Dans DDD, vous obtenez tous les objets métier d'un référentiel. Le référentiel cache votre stockage de données et votre implémentation, et résoudra vos problèmes sur la façon de rechercher des données et de garder la trace des changements de base de données. Étant donné que chaque objet métier est extrait du référentiel, le référentiel sera votre unique point de changement.Le dépôt peut alors interroger la base de données de quelque façon que vous trouvez efficace, puis construire vos objets de domaine à partir de ces données:

var books = new BookRepository().GetAllBooks(); 

Vous devriez être en mesure de coder les dépôts avec l'une des technologies mentionnées par le juge.