2011-09-14 13 views
1

Entity FrameworkとTelerik RadGridを使用しています。重複した名前の製品が挿入された場合、例外をスローする制約があるテーブルがあります。私はビジネスレイヤーで例外をキャッチしようとしていますが、catchブロックをうまく走っているようですが、Telerik RadScriptManagerからエラーが発生しますエンティティフレームワークで重複挿入エラーが発生する

"Microsoft JScriptランタイムエラー:Sys.WebForms.PageRequestManagerServerErrorException:例外がスローされました呼び出しのターゲットによって。

「Duplicate Product」というメッセージが表示されるJqueryポップアップの代わりに、誰かが間違っていることを知っていますか?例外は私のDALで扱われる必要がありますか?しかし、私はBLL以外のどこかからBusinessRuleExceptionsを投げるべきだとは思わない。誰かがJscriptエラーを引き起こしている可能性があるアイデアがある場合、下のBLクラスにInsert関数を掲載しました。ありがとうございます!

編集 オブジェクトデータソースTypeNameがビジネスレイヤーに関連付けられていますProductBL Product BL関数Insert_ProductがInsert関数としてObjectDataSourceから呼び出されています。 Product.csコードビハインドクラスでは、商品名を渡している場所に商品を挿入する機能があります(下記参照)。この機能にはtry catch bloeckがあります。ここで例外を投げるべきですか?ビジネスレイヤーにBusinessRulExceptionをスローすることが正しいと思いました。あなたはRadGrid_ItemInsertedを活用したいと思うでしょう

Product.CSクラス(データソースInsertコマンドオブジェクト)

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(); 
    } 
+0

Insert_Productを呼び出した場所から、BusinessRuleExceptionを構築する際にexをパラメータとして渡してください。例外は例外ではない場合、Exception型のチェックで置き換えて「ex.InnerException.Message.Contains」という恐ろしいものを削除してください。失敗した場合は、何もログに記録していないか、何かを再スローしていないので、他のすべての例外を隠しています:( –

+0

こんにちはDavide、私は私の説明を更新して、ObjectDataSourceから関数がどのように呼び出されているか、 ex.GetType.Nameをチェックするようにチェックを変更しました。あなたや他の人がJSエラーを取得している理由を知っていれば教えてください – Shokwave

答えて

0

ok私はこれをあまりにも多くの時間を無駄にした後、これを理解しました。 Telerikがビジネスレイヤークラスからビジネスルール例外を投げるようなことはないようです。だから、私はオブジェクトデータ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がフィールド上一意制約上の重複エラーを投げていた場合を確認する方法を知っていた唯一の方法のthats。誰かがこれを行うよりエレガントな方法を知っている場合は、共有してください。これが他の人にも役立つことを願っています。

1

イベント。そこには、イベントargにスローされた例外への参照が含まれていなければならず、例外を処理したことをユーザーに気付かれないようにマークすることができます。

これは、ODSに完全挿入をさせ、手動で挿入しないようにする場合です。

関連する問題