Tec*_*ver 8 c# asp.net entity-framework-4
我是ASP.NET的新开发人员,这是我第一次使用Linq-to-Entities和Entity Framework。我现在的问题是关于使用最佳实践来连接实体或数据库。我知道try-catch块非常昂贵。但是,当我需要连接到数据库时,是否应该使用它们?我问这个问题是因为我有大约20个实体,并且在我的数据访问层中,对于每个这些实体我都有所有的GetData()方法。您能对此提出建议吗?
C#代码:
public static IEnumerable<Items> getData()
{
List<Items> itemsList = new List<Items>();
try
{
using (ItemsDBEntities context = new ItemsDBEntities())
{
itemsList = (from item in context.Items
select new Items()
{
ID = item.ID,
Code = item.Code,
Name = item.Name,
StatusID = item.StatusID
}).ToList();
}
}
catch (EntityException ex)
{
//something wrong about entity
}
catch (Exception ex)
{
//Don't know what happend...
}
return itemsList;
}
Run Code Online (Sandbox Code Playgroud)
你绝对不希望赶上Exception这里,因为你可能会掩盖其他的(可能更大)的问题与您的代码。
通常,只有打算以某种方式处理异常时,才应捕获异常。例如,在您的方案中,如果连接失败,则可能要显示UI消息。最好的方法是让异常冒泡到您实际要在其中处理的层。
为了避免各层之间的耦合,一种好的方法是在DAL中捕获特定于存储的异常,并引发一个特定于应用程序的异常,然后可以在上层进行处理,例如
DAL
public static IEnumerable<Items> getData()
{
List<Items> itemsList = new List<Items>();
try
{
using (ItemsDBEntities context = new ItemsDBEntities())
{
itemsList = (from item in context.Items
select new Items()
{
ID = item.ID,
Code = item.Code,
Name = item.Name,
StatusID = item.StatusID
}).ToList();
}
}
catch (EntityException ex)
{
throw new ConnectionFailedException(ex);
}
return itemsList;
}
Run Code Online (Sandbox Code Playgroud)
用户界面
try
{
var items = Repo.getData();
...
}
catch (ConnectionFailedException)
{
MessageBox.Show("There was a problem accessing the database, please try again.");
}
Run Code Online (Sandbox Code Playgroud)
如果您需要有关如何实现自定义异常的指南,请参见此答案。
小智 5
try-catch 块非常昂贵。
试便宜,抓便宜,扔贵。因此,如果代码执行遵循正常路径(不产生异常),try-catch 没有问题。(顺便说一句,昂贵的抛出是您应该避免代码中基于异常的逻辑流的原因之一)即使您避免了 try-catch 块,抛出仍然很昂贵。
我应该在需要连接到数据库时使用它们吗?
这归结为你的判断力。通常,在应用程序的层之间进行裸投是一个坏主意。在应用程序的单个块内有多个捕获同样是个坏主意。
我会说你肯定想在你的 DAL 的顶层捕获异常:客户端不应该关心你的内部问题(数据库连接、超时、错误登录等)。
在这里我必须基本上只引用以前的答案:
避免层之间的耦合...引发自定义的、特定于应用程序的异常,然后您可以在上层处理该异常
你catch的两个好主意是 (1) 记录异常(因此 DAL 的一方事后知道它),(2) 进行单元测试(预先执行 SQL 将已知数据写入 DB,然后调用 GetData())以便您可以在发布 DAL 供客户使用之前检测一般问题
| 归档时间: |
|
| 查看次数: |
15035 次 |
| 最近记录: |