Исключение Броска Entity Framework для Вставки Дубликата ошибка - PullRequest
1 голос
/ 14 сентября 2011

Я использую Entity Framework и Telerik RadGrid.У меня есть таблица с ограничением, которое выдает исключение, если в качестве вставки используется продукт с повторяющимся именем.Я пытаюсь перехватить исключение на своем бизнес-уровне, и оно, похоже, нормально проходит через блок перехвата, но я получаю ошибку от Telerik RadScriptManager

"Ошибка времени выполнения Microsoft JScript: Sys.WebForms.PageRequestManagerServerErrorException: исключение имеетбыл брошен целью вызова ".

вместо всплывающего окна Jquery, которое я ожидаю с сообщением "Duplicate Product" Кто-нибудь знает, что я делаю неправильно?нужно ли исключение вести себя в моем DAL?но я не думаю, что я должен бросить BusinessRuleExceptions откуда-то, кроме BLL.Я разместил функцию Вставка в своем классе BL ниже, если у кого-то есть идея, что может быть причиной ошибки Jscript, пожалуйста, дайте мне знать, спасибо !!

Редактировать объектный источник данных TypeName привязан к бизнесуСлой ProductBL Product BL Функция Insert_Product вызывается из моего ObjectDataSource как функция Вставка.В коде Product.cs класса у меня есть функция для Вставки продуктов, в которую я передаю Имя продукта (см. Ниже), у этой функции есть блок try catch ... Должен ли я генерировать исключение здесь?Я подумал, что было бы правильно выбросить исключение 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 ]

1 голос
/ 15 сентября 2011

Вы захотите подключиться к событию RadGrid_ItemInserted.Там у аргумента события должна быть ссылка на выброшенное исключение, и вы можете отметить, что обработали исключение, чтобы оно не всплыло для пользователя.

Это если вы позволяете ODS выполнить полную вставкуи не вставлять вручную.

0 голосов
/ 29 сентября 2011

хорошо, я понял это, потратив слишком много времени на это. Похоже, что Telerik не нравится, когда я выкидываю исключение из бизнес-правила из класса Business Layer. Таким образом, я обработал исключение вместо этого в codebehind в событии 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. Если кто-то знает более элегантный способ сделать это, пожалуйста, поделитесь. Надеюсь, это поможет кому-то еще.

...