(对不起我的英语)例如,在我的 DAL 中,我有一个 AuthorDB 对象,它有一个 Name 和一个 BookDB 对象,它有一个 Title 和一个 IdAuthor。
现在,如果我想显示所有书籍及其相应作者的姓名,我必须获取所有书籍的集合,并使用 IdAuthor 属性为每本书找到作者姓名。这会对数据库进行大量查询,显然可以使用简单的 JOIN。
我有哪些选择?创建一个包含作者姓名和书名的“自定义”对象?如果是这样,维护可能会变得很糟糕。
那么,有哪些选择呢?谢谢!
(对不起我的英语)例如,在我的 DAL 中,我有一个 AuthorDB 对象,它有一个 Name 和一个 BookDB 对象,它有一个 Title 和一个 IdAuthor。
现在,如果我想显示所有书籍及其相应作者的姓名,我必须获取所有书籍的集合,并使用 IdAuthor 属性为每本书找到作者姓名。这会对数据库进行大量查询,显然可以使用简单的 JOIN。
我有哪些选择?创建一个包含作者姓名和书名的“自定义”对象?如果是这样,维护可能会变得很糟糕。
那么,有哪些选择呢?谢谢!
当可靠、高效和通用的工具可用时,不要编写错误、低效和专业的东西。免费。
选择一个 ORM。NHibernate、ActiveRecord、SubSonic、NPersist、LinqToEF、LinqToSQL、LLBLGenPro、DB4O、CSLA 等。
非常感谢您的意见。
实际上,我们试图使数据库对象尽可能接近数据库中相应表的实际列。这就是为什么我们不能真正将(字符串)“作者”属性添加到 BookDB 对象。
这是我在使用“查看”对象时看到的问题。在数据库中,如果出于任何原因必须修改架构(例如:在 Book 表中,必须为“The_Title”修改“标题”列,我们如何轻松知道必须修改的所有“视图”对象?被修改?换句话说,当他们进行使用多个连接的查询时,我如何知道哪些对象必须被修改?
在这里,由于我们有一个 AuthorsBooks 对象,我们可以通过名称看到它可能对 book 和 author 表进行查询。但是,对于在表之间进行 4 或 5 个连接的对象,我们不能依赖对象名称。
有任何想法吗?(再次感谢您,这是一个很棒的网站!)
我建议你看看领域驱动设计。在 DDD 中,您从存储库中获取所有业务对象。存储库隐藏了您的数据存储和实现,并将解决您在如何查询数据和跟踪数据库更改方面的问题。因为每个业务对象都是从存储库中检索的,所以存储库将是您的单点更改。然后,存储库可以以您认为有效的任何方式查询您的数据库,然后从该数据构建您的域对象:
var books = new BookRepository().GetAllBooks();
您应该能够使用 Justice 提到的任何技术对存储库进行编码。
您可以在具有内置连接的数据库中创建一个视图,并将一个对象绑定到该视图,例如 AuthorBooksDB。它不会造成太严重的维护问题,因为视图可以隐藏任何潜在的更改并保持静态。
如果您可以将数据库查询与对象构建分开,那么您可以创建一个查询来获取您需要的数据。然后将该数据传递给您的构建器并让它返回您的书籍。
使用 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;
}
}