2012-06-29 2 views
1

У меня есть эта хранимая процедура, которая отображается в объекте Entity Framework 4.1. Вызов производится в пределахEntity Framework выполняет как хранимые процедуры INSERT, так и UPDATE, когда вы делаете INSERT

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, и я отладки & увидеть эти значения, передаваемые и PriceTotal приходит 20120.00

Я не мог понять, почему он не делает ELSE вычисление IF & использовать цена.

Кто-нибудь еще видит что-то странное? Это было непросто в течение нескольких дней. Любая помощь оценивается. Благодаря

Update Я обновил титул лучшего руководства других

ответ

0

После нескольких минут размещения вопроса, я понял все это.

На самом деле было 2 ошибки.

  1. В инфраструктуре Entity используется хранимая процедура UPDATE, даже когда я пытаюсь ВСТАВИТЬ новые записи. Для записей в хранимой процедуре UPDATE требуется CarID [первичный ключ]. Может быть, EF сначала делает INSERT, а затем делает UPDATE сразу, даже для создания новых записей?

  2. У UPDATE sproc была ошибка проверки NULL с использованием <>. Это должно быть НЕ НЕТ

В любом случае, сейчас это большая проблема. Как заставить EF использовать INSERT sproc, а не UPDATE, когда я только хочу сделать, это создать новую запись?

Я пробовал DbEntityContext.ObjectStateManager.ChangeObjectState (carInfo, EntityState.Added); и все еще EF продолжали называть UPDATE sproc.

Смежные вопросы