为具有对另一个对象的引用的对象创建数据访问层的最佳实践是什么?

时间:2008-10-11 18:04:12

标签: data-access-layer business-logic

(对不起我的英文) 例如,在我的DAL中,我有一个AuthorDB对象,它有一个Name 和BookDB对象,具有Title和IdAuthor。

现在,如果我想要显示所有具有相应作者姓名的书籍,我必须获得所有书籍的集合,并且对于每个书籍,使用IdAuthor属性,找到作者的姓名。这会对数据库进行大量查询,显然,可以使用简单的JOIN。

我有什么选择?创建一个包含作者姓名和书名的“自定义”对象?如果是这样,维护可能会变得糟糕。

那么,有哪些选择? 谢谢!

5 个答案:

答案 0 :(得分:3)

当可靠,高效且通用的工具可用时,不要写错误,低效和专业的东西。免费。

选择一个ORM。 NHibernate,ActiveRecord,SubSonic,NPersist,LinqToEF,LinqToSQL,LLBLGenPro,DB4O,CSLA等。

答案 1 :(得分:0)

您可以在数据库中创建一个内置了连接的视图,并将一个对象绑定到该视图,例如AuthorBooksDB。它不会造成太糟糕的维护问题,因为视图可以隐藏任何潜在的更改并保持静态。

答案 2 :(得分:0)

如果您可以将数据库查询与对象构建分开,则可以创建查询以获取所需的数据。然后将该数据传递给您的构建器并让它返回您的书籍。

使用Linq to SQL,可以轻松完成:

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,
                        };
}

使用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;
    }
}

答案 3 :(得分:0)

非常感谢您的投入。

实际上,我们正在尝试使数据库对象尽可能接近数据库中相应表的实际列。这就是我们无法真正为BookDB对象添加(字符串)'Author'属性的原因。

以下是使用“查看”对象时遇到的问题。在数据库中,如果由于任何原因必须修改模式(例如:在Book表中,'Title'列必须针对'The_Title'进行修改,我们如何轻松地知道所有'View'对象必须被修改?换句话说,如何知道在进行多个连接的查询时必须修改哪些对象?

这里,由于我们有一个AuthorsBooks对象,我们可以通过名称看到它可能会对书和作者表进行查询。但是,对于在表之间建立4或5个连接的对象,我们不能依赖于对象名称。

有什么想法吗? (再次感谢您,这是一个很棒的网站!)

答案 4 :(得分:0)

我建议你看一下Domain Driven Design。在DDD中,您可以从存储库中获取所有业务对象。存储库隐藏了您的数据存储和实现,并将解决您如何查询数据和跟踪数据库更改的问题。因为每个业务对象都是从存储库中检索的,所以存储库将是您的唯一变更点。然后,存储库可以以您认为有效的任何方式查询数据库,然后根据该数据构建域对象:

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

您应该能够使用Justice提到的任何技术对存储库进行编码。

相关问题