执行INSERT时,实体框架执行INSERT和UPDATE存储过程

时间:2012-06-29 14:45:05

标签: entity-framework stored-procedures

我有这个存储过程,它映射在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计算&使用价格。

有没有人看到奇怪的东西?现在这几天令人生畏。任何帮助赞赏。感谢

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

1 个答案:

答案 0 :(得分:0)

在发布问题几分钟后,我发现了这一切。

实际上有2个错误。

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

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

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

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