1

このストアドプロシージャは、EntityFramework4.1オブジェクトにマップされています。呼び出しは内で行われます

using (TransactionScope transaction = new TransactionScope())
{
            try
            {
                DbEntity.Car.AddObject(CarInfo);
                DbEntity.SaveChanges();

/* Other object savings */

                transaction.Complete();

                DbEntity.AcceptAllChanges();
            }
            catch (Exception exp)
            {
                throw exp;
            }
            finally
            {
                DbEntity.Dispose();
            }
}

現在、ストアドプロシージャのマッピングが行われているのがわかります。MS SQLサーバーでストアドプロシージャを単独で実行すると、正しく実行されます。

これがストアドプロシージャです

ALTER PROCEDURE [dbo].[Carinsert] @Qty               INT
                              ,@StyleID          INT
                              ,@TFee             MONEY
                              ,@HWayTax          MONEY
                              ,@OFees            MONEY
                              ,@OFeesDescription NTEXT
                              ,@MUp              DECIMAL(18, 4)
                              ,@BAss             MONEY
                              ,@PriceMSRP        MONEY
                              ,@PriceSpecial     MONEY
AS
BEGIN
  SET nocount ON

  DECLARE @PTotal MONEY
  DECLARE @TaxFeesNet MONEY
  DECLARE @CarID INT

  SET @TaxFeesNet = Isnull(@TFee, 0) + Isnull(@HWayTax, 0)
                    + Isnull(@OFees, 0)

  IF( @PriceSpecial IS NULL )
    BEGIN
        SET @PTotal = @PriceMSRP + @TaxFeesNet
    END
  ELSE
    BEGIN
        SET @PTotal = @PriceSpecial + @TaxFeesNet
    END

  INSERT INTO Car
              (Qty
               ,StyleID
               ,MUp
               ,BAss
               ,PriceMSRP
               ,PriceSpecial
               ,TFee
               ,HWayTax
               ,OFees
               ,OFeesDescription
               ,PriceTotal)
  VALUES      (@Qty
               ,@StyleID
               ,@MUp
               ,@BAss
               ,@PriceMSRP
               ,@PriceSpecial
               ,@TFee
               ,@HWayTax
               ,@OFees
               ,@OFeesDescription
               ,@PTotal)

    SELECT Scope_identity() AS CarID
END 

これをMSSQLのように実行すると、テーブルのPriceTotal列が3444.00として計算されます。これは正しいことです。

    @Qty= 5,
    @StyleID = 331410,
    @TFee = NULL,
    @HWayTax = NULL,
    @OFees = NULL,
    @OFeesDescription = NULL,
    @MUp = 4,
    @BAss = 10000,
    @PriceMSRP = 20120,
    @PriceSpecial = 3444

MVC Webアプリケーションを実行すると、デバッグして、これらが渡された値であり、PriceTotalが20120.00になることを確認します。

なぜIFELSE計算を行わず、価格を使用しないのか理解できませんでした。

他の誰かが何か奇妙なものを見ていますか?これは、ここ数日気が遠くなるようなものです。助けていただければ幸いです。ありがとう

更新 他の人をよりよくガイドするためにタイトルを更新しました

4

1 に答える 1

0

質問を投稿してから数分後、私はそれをすべて理解しました。

実際には2つのバグがありました。

  1. 新しいレコードを挿入しようとしても、エンティティ フレームワークは UPDATE ストアド プロシージャを使用していました。記録のために、UPDATE ストアド プロシージャには CarID [主キー] が必要でした。新しいレコードを作成する場合でも、EF が最初に INSERT を実行し、次にすぐに UPDATE を実行する可能性がありますか?

  2. UPDATE sproc には、<> を使用して NULL をチェックするバグがありました。IS NOT NULL である必要がありました

いずれにせよ、今これはより大きな問題です。新しいレコードを作成するだけの場合に、UPDATE ではなく INSERT sproc を使用するように EF を強制するにはどうすればよいですか?

DbEntityContext.ObjectStateManager.ChangeObjectState(carInfo, EntityState.Added); を試しました。それでもEFはUPDATE sprocを呼び出し続けました。

于 2012-06-29T16:04:56.617 に答える