我有这个存储过程,它映射在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计算&使用价格。
有没有人看到奇怪的东西?现在这几天令人生畏。任何帮助赞赏。感谢
更新 我更新了标题以更好地指导他人
答案 0 :(得分:0)
在发布问题几分钟后,我发现了这一切。
实际上有2个错误。即使我尝试INSERT新记录,实体框架也使用了UPDATE存储过程。仅用于记录,UPDATE存储过程需要CarID [主键]。可能是EF首先执行INSERT,然后立即执行UPDATE,即使是创建新记录?
UPDATE sproc有一个使用<>检查NULL的错误。应该是IS NOT NULL
无论如何,现在这是一个更大的问题。如何强制EF使用INSERT sproc而不是UPDATE,我只想创建一个新记录?
我试过了 DbEntityContext.ObjectStateManager.ChangeObjectState(carInfo,EntityState.Added); 并且EF仍然在调用UPDATE sproc。