1

我有这个存储过程,它映射在 Entity Framework 4.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 

如果我在 MS SQL 上执行此操作,它会将表中的 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

我无法弄清楚为什么它不进行 IF ELSE 计算并使用价格。

有没有人看到什么奇怪的东西?这已经令人生畏了好几天了。任何帮助表示赞赏。谢谢

更新 我更新了标题以更好地指导他人

4

1 回答 1

0

在发布问题几分钟后,我想通了。

实际上有2个错误。

  1. 即使我尝试插入新记录,实体框架也使用了 UPDATE 存储过程。只是为了记录,UPDATE 存储过程需要 CarID [主键]。可能是 EF 首先执行 INSERT 然后立即执行 UPDATE,即使是为了创建新记录?

  2. UPDATE sproc 有一个使用 <> 检查 NULL 的错误。它应该是 IS NOT NULL

无论如何,现在这是一个更大的问题。当我只想创建一条新记录时,如何强制 EF 使用 INSERT sproc 而不是 UPDATE?

我试过 DbEntityContext.ObjectStateManager.ChangeObjectState(carInfo, EntityState.Added); 并且仍然 EF 继续调用 UPDATE sproc。

于 2012-06-29T16:04:56.617 回答