我正在努力将好的数据库设计的概念与好的面向对象的设计联系起来。
传统上,如果我想在直放站中显示新闻报道列表,则可以使用以下方法:
<script runat="server">
void ShowNews()
{
rptNewsStories.DataSource = News.GetAllNews(); // Returns a DataTable
rptNewsStories.DataBind();
}
</script>
<asp:Repeater id="rptNewsStories" runat="server">
<ItemTemplate>
<div>
<span class="Title"><%# Eval("Title")"%> (<%# Eval("Location")"%>)</span>
<p>
<%# Eval("Summary")"%>
</p>
<ul>
<li>Added by: <%# Eval("AddedByFullName")%></li>
<li>Added on: <%# Eval("AddedOn")%></li>
</ul>
</div>
</ItemTemplate>
</asp:Repeater>
在这里 News.GetAllNews()返回数据表,这只是存储过程返回内容的转储。存储过程被编写为通过使用联接返回数据,因此它的值(value)不止一个表。
这样做的好处是,存储过程可以在数据库中查找谁从新闻表中存在的AddedByID 中添加了新闻故事的人,并以返回的人全名作为AddedByFullName 值来返回。
但是,如果我尝试放弃使用DataTable而是返回News对象的List,则会得到以下信息:
<script runat="server">
void ShowNews()
{
rptNewsStories.DataSource = News.GetAllNews(); // Returns a List<News>
rptNewsStories.DataBind();
}
</script>
<asp:Repeater id="rptNewsStories" runat="server">
<ItemTemplate>
<div>
<span class="Title"><%# Eval("Title")"%> (<%# Eval("Location")"%>)</span>
<p>
<%# Eval("Summary")"%>
</p>
<ul>
<li>Added by: <!-- Here there is only a AddedByUserID, not an AddedByFullName value --></li>
<li>Added on: <%# Eval("AddedOn")%></li>
</ul>
</div>
</ItemTemplate>
</asp:Repeater>
但是,现在剩下的问题是,我要显示的某些值(如AddedByFullName )在News对象中不存在,因为它们不是明确设置的,而是从查找ID中检索到的在对象中。
我想返回对象而不是数据表,但是我不知道弥合这种差距的最佳方法。
我要:
*在新闻类中为可以从数据库返回的与此数据有关的每个附加值创建附加属性?
*对于许多附加值的特定情况,请坚持使用 DataTables 。
还是我只是完全走错了路!
最佳答案
您的选择受到您愿意用作数据访问的基础技术的限制。目前,VS工具集和.Net框架支持几种替代方法:
DataTable
对象中进行设计。 IQueryable<T>
和LINQ语法。 通过这些,除ADO.Net类型的数据集外,所有其他类型的数据集都允许您按自己的要求指定导航关系,无论它们是急切还是延迟加载。在您描述的情况下,使用这些技术的自然习惯是在设计器中显式地建模新闻文章和作者之间的关系,并让该框架处理将适当的数据加载到适当的类型中的问题,最终意味着联接问题是由应用程序数据访问层(框架)而不是由显式创建的存储过程隐式处理的。
从选择如何获取数据到如何显示数据以及如何进行更新,技术的选择将遍及代码中的所有位置,这些技术都不容易互换。我个人认为,LINQ to SQL可以在功能和复杂性之间取得适当的平衡。