C# 实体框架因插入重复错误引发异常

C# 实体框架因插入重复错误引发异常,c#,jquery,entity-framework,entity-framework-4,telerik,C#,Jquery,Entity Framework,Entity Framework 4,Telerik,我正在使用实体框架和Telerik RadGrid。我有一个带有约束的表,如果将具有重复名称的产品尝试作为插入,该表将引发异常。我试图在我的业务层捕获异常,它似乎很好地通过了捕获块,但我从Telerik RadScriptManager那里得到了一个错误 “Microsoft JScript运行时错误:Sys.WebForms.PageRequestManagerServerErrorException:调用目标引发了异常。” 有人知道我做错了什么,而不是我期待的带有消息“复制产品”的Jquer

我正在使用实体框架和Telerik RadGrid。我有一个带有约束的表,如果将具有重复名称的产品尝试作为插入,该表将引发异常。我试图在我的业务层捕获异常,它似乎很好地通过了捕获块,但我从Telerik RadScriptManager那里得到了一个错误

“Microsoft JScript运行时错误:Sys.WebForms.PageRequestManagerServerErrorException:调用目标引发了异常。”

有人知道我做错了什么,而不是我期待的带有消息“复制产品”的Jquery弹出窗口吗?是否需要在我的DAL中处理异常?但我不认为我应该从BLL以外的地方抛出业务规则例外。我已经在下面的BL类中发布了插入函数,如果有人知道是什么导致了Jscript错误,请告诉我,谢谢

编辑 对象数据源TypeName绑定到业务层ProductBL Product BL函数Insert\u正在从我的ObjectDataSource调用Product作为Insert函数。在Product.cs code behind类中,我有一个函数,用于在传递产品名称的位置插入产品(见下文),该函数有一个try-catch-bloeck..我应该在这里抛出异常吗?我认为在业务层中引入BusinessRuleException是正确的

Product.CS类(对象数据源插入命令)

产品

   public void Insert_Product(Product product)
      {
        try
        {
            repository.Insert_Product(product);
        }
        catch (Exception ex)
        {
            if (ex.GetType().Name == "UpdateException")
            {

               throw new BusinessRuleException("Duplicate Product");
            }

        }
    }
产品名称

 public void InsertProduct(Product product)
    {

        context.Products.AddObject(product);

        context.SaveChanges();
    }

您需要点击RadGrid_ItemInserted事件。在那里,event arg应该有一个对抛出的异常的引用,并且您可以标记您已经处理了异常,这样用户就不会发现异常


如果您让ODS执行完全插入,而不是手动插入。

您将希望点击RadGrid\u ItemInserted事件。在那里,event arg应该有一个对抛出的异常的引用,并且您可以标记您已经处理了异常,这样用户就不会发现异常


如果您让ODS执行完全插入,而不是手动插入。

好的,我在这上面浪费了太多时间后才发现这一点。似乎Telerik不喜欢我从业务层类抛出业务规则异常。因此,我最终在对象数据源插入事件的codebehind中处理了异常。这就是我在事件的RadalertWidow中显示错误所做的

enter code here
protected void ODSProducts_Updated(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception != null)
        {
            if (((e.Exception.InnerException).InnerException).Message.Contains("Cannot insert duplicate key row"))
            {
                RadWindowManager.RadAlert("Duplicate Product, Enter a new Product", 330, 100, "Insert Error", "");
                e.ExceptionHandled = true;
            }
        }
    }

我不喜欢检查.InnerException.Message.Contains位,但这是我知道的唯一一种方法,可以确保异常是否是在字段的唯一约束上抛出重复错误的SQL。如果有人知道一种更优雅的方法,请分享。希望这对其他人也有帮助。

好吧,我在这上面浪费了太多的时间,终于明白了。似乎Telerik不喜欢我从业务层类抛出业务规则异常。因此,我最终在对象数据源插入事件的codebehind中处理了异常。这就是我在事件的RadalertWidow中显示错误所做的

enter code here
protected void ODSProducts_Updated(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception != null)
        {
            if (((e.Exception.InnerException).InnerException).Message.Contains("Cannot insert duplicate key row"))
            {
                RadWindowManager.RadAlert("Duplicate Product, Enter a new Product", 330, 100, "Insert Error", "");
                e.ExceptionHandled = true;
            }
        }
    }

我不喜欢检查.InnerException.Message.Contains位,但这是我知道的唯一一种方法,可以确保异常是否是在字段的唯一约束上抛出重复错误的SQL。如果有人知道一种更优雅的方法,请分享。希望这对其他人也有帮助。

显示从何处调用Insert_Product,在BusinessRuleException的构造中将ex作为参数传递,并请删除以下可怕的内容:“ex.InnerException.Message.Contains”将其替换为检查异常类型,如果异常不是该类型且if失败,您没有记录任何内容或重新抛出任何内容,这样做会隐藏所有其他可能的异常:(嗨,Davide,我更新了我的描述,请参见上文,以显示如何从ObjectDataSource调用函数的详细信息,并将检查更改为检查ex.GetType.Name。请告诉我,如果您或任何其他人知道我为什么要从调用Insert_Product的位置获取JS errorshow,请在构建总线时将ex作为参数传递。)IneSRuleException并请删除该可怕的内容:“ex.InnerException.Message.Contains”将其替换为检查异常类型,如果异常不是该异常,并且该异常失败,则您不会记录任何内容或重新抛出任何内容,这样做会隐藏所有其他可能的异常:(嗨,Davide,我更新了我的描述请参见上文,以显示如何从ObjectDataSource调用函数的详细信息,并将检查更改为检查ex.GetType.Name。如果您或其他人知道我为什么会出现JS错误,请告诉我。)