【发布时间】:2014-10-07 16:44:34
【问题描述】:
我们有一个几年前制作的 ASP.NET Web 表单解决方案。该解决方案包含以下几层:
-
数据访问层:我们可以访问数据的地方,只有几个像这样的程序
public void execute_NonQuery_sql(字符串 SQL) {...}
-
数据实体:在这一层中,我们定义了不同的实体和访问数据库的查询。
public static DataTable sel_links() { mySQL_DA da = new mySQL_DA(); string sQuery = "SELECT Id, Name, WebSite, Summary FROM links ORDER BY OrderPos ASC"; return da.get_DataTable_sql(sQuery); } -
数据逻辑:我们在其中调用过程并返回对象。
public List<LinksDN> sel_links_web() { try { using (DataTable dt = LinksDA.sel_links_web()) { List<LinksDN> ListElements = new List<LinksDN>(); foreach (DataRow dr in dt.Rows) { LinksDN Element = new LinksDN(dr); ListElements.Add(Element); } return ListElements; } } catch (Exception e) { throw e; } } 表示层:我们有网页的地方。我们调用了逻辑层的所有程序。
现在我们正在开发一个类似的应用程序,但我们想使用实体框架和模型绑定。 我们正在使用 Visual Studio 2013 Web Forms Framework 4.5 进行开发。
我们过去写了很多代码,但现在我们发现更容易了,因为有了 EF,我们不必再写那么多代码了。
但我们仍有几个问题:
1) 我们如何构建应用程序?我们需要创建不同的项目作为层吗?
我们已经看到,我们不需要有访问数据的过程,因为 EF 会处理这些。那么 2 层是否足够,一层用于模型,另一层用于业务逻辑(当然还有表示层)?
2) 使用EF的时候,是否需要dispose DbContext? 我们看过这个例子,对吗?
public class LinksBL
{
ObjectDbContext db = new ObjectDbContext();
public List<links> GetLinks()
{
return db.links;
}
public List<links> GetLinks()
{
return db.links;
}
public links GetLink([QueryString("id")]int? LinkId)
{
return db.links.Find(LinkId);
}
}
3) 另外,如果实体链接(例如)有很多属性,即使您不使用它们,您是否总是返回所有属性?
我们可能有一个列表只需要 3 个属性,而另一个列表需要所有属性。我们是否必须创建 2 个不同的过程,每个过程一个,并且只返回我们将要使用的属性? 如果是,我们怎样才能只返回几个属性?
问题可能太明显了,但我们曾经开发过不同的方式,而 EF 对我们来说是新的。 感谢您的帮助。
【问题讨论】:
-
一方面,摆脱那些 try/catch 块。他们所做的只是弄乱堆栈跟踪,因此您无法确定异常的真正来源。
-
根据您是先执行模型还是先执行代码,您可以在实体上设置属性以表示忽略此列,或向 EF 提供有关如何处理每一列的其他提示。
-
约翰,使用 catch { throw; 是否正确? } 并在它们冒泡后在页面级别处理异常?
标签: asp.net entity-framework webforms