插入重复错误的实体框架抛出异常

时间:2011-09-14 19:01:01

标签: c# jquery entity-framework entity-framework-4 telerik

我正在使用Entity Framework和Telerik RadGrid。我有一个带有约束的表,如果尝试将具有重复名称的产品作为插入,则会抛出异常。我试图在我的业务层中捕获异常并且它似乎通过catch块运行良好但我从Telerik RadScriptManager得到错误

“Microsoft JScript运行时错误:Sys.WebForms.PageRequestManagerServerErrorException:调用目标已抛出异常。”

而不是我期待的Jquery弹出消息“重复产品”有谁知道我做错了什么?异常是否需要在我的DAL中表现?但我不认为我应该从BLL以外的地方抛出BusinessRuleExceptions。我在下面的BL类中发布了Insert函数,如果有人知道可能导致Jscript错误的原因,请告诉我,谢谢!!

编辑 对象数据源TypeName绑定到Business层ProductBL 产品BL函数Insert_Product作为Insert函数从我的ObjectDataSource调用。在类后面的Product.cs代码中,我有一个插入产品的函数,我传递产品名称(见下文),这个函数有一个try catch bloeck ..我应该在这里抛出异常吗?我认为在业务层中抛出BusinessRulException是正确的。

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

 protected void ODSProducts_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
    {
        try
        {

            TextBox txtProductName = (TextBox)ProductsGrid.MasterTableView.GetInsertItem().FindControl("txtProductName");

            ((ACME.DAL.Product)e.InputParameters[0]).Product.product_name = txtProductName.Text;

        }
        catch (Exception ex)
        {
            HTMLError.HtmlError.LogHtmlError(ex, Application["ErrorLog"].ToString());
            throw;
        }
    }

ProductsBL.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");
            }

        }
    }

Product.DAL

 public void InsertProduct(Product product)
    {

        context.Products.AddObject(product);

        context.SaveChanges();
    }

2 个答案:

答案 0 :(得分:1)

您需要点击RadGrid_ItemInserted事件。事件arg应该引用抛出的异常,并且您可以标记您处理了异常,因此它不会冒泡到用户。

如果您让ODS执行完整插入,而不是手动插入,那就是这样。

答案 1 :(得分:0)

好吧,在浪费了太多时间之后,我想出了这个。看起来Telerik不喜欢我从Business Layer类中抛出Business规则异常。所以我最终在对象数据source_Inserted事件的代码隐藏中处理异常。这就是我在事件中显示RadAlertWindow中的错误。

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在字段上的唯一约束上抛出重复错误的唯一方法。如果有人知道更优雅的方式,请分享。希望这也有助于其他人。