如何使用try-catch块连接到实体框架?

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)

Jam*_*mes 6

你绝对希望赶上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 供客户使用之前检测一般问题


Lei*_*ski 1

不要捕捉异常,除非你打算用它做点什么。例如,也许您想在允许异常冒泡之前重试连接到数据库 x 次。我建议不要费心将代码包装在 try catch 中,除非您要做一些特殊的事情。