实体框架6未捕获异常

时间:2016-03-09 13:24:55

标签: c# entity-framework linq

我无意中忘记提供正确的Linq语句并编译,运行该项目。并且偶然发现了一种非常奇怪的行为。

我希望得到此代码抛出的异常,但相反,它是由于该方法而被移交的。意思是,异常附加到我的" GetAllProducts"的返回值。方法

这是我的示例代码:

public static IEnumerable<Product> GetAllProducts()
{
    try
    {
        using (var ctx = new MyContext())
        {
            return ctx.Products.Select(p => new Product { });
        }
    }
    catch (Exception e)
    {
        throw new MySpecificException(e);
    }
}

如果有人能解释这种行为,我会很开心:)

2 个答案:

答案 0 :(得分:5)

.Select是一个延迟操作 - 它实际上不会查询或收集任何记录,直到您枚举IEnumerable<T>您应该从.ToList().ToArray()返回一些内容。这些实际上导致IEnumerable<T>(或技术上IQueryable<T>)枚举。

答案 1 :(得分:1)

要清楚,此方法不返回任何异常,此方法的返回值也不附加异常。此方法返回的是IEnumerable<Product>,可以枚举,但尚未枚举。 “枚举”是指通过一系列事物并对集合中的每件事做一些事情。

GetAllProducts方法返回时,尚未触及数据库,但返回IEnumerable<Product>,将在枚举IEnumerable<Product>时尝试查询数据库。

如果您想捕获您看到的异常,请在代码中添加try / catch块,最终枚举IEnumerable<Product>,如下所示:

var products = GetAllProducts();
try
{
    foreach(var product in products)  // Enumeration happens here, exception thrown
    {
        // do something with each product
    }
}
catch (Exception e)
{
    // Handle exception
}