asp.net-mvc – EF映射对象不兼容的数据读取器异常

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – EF映射对象不兼容的数据读取器异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用实体框架工作,并更新了一个表及其存储过程,但是当调用存储过程时,我收到以下错误

The data reader is incompatible with the specified
‘FormValueModel.Valuation’. A member of the type,‘ValuationId’,does
not have a corresponding column in the data reader with the same name.

ValuationId是我想要自动递增的主要关键。

我可以从sql管理工作室执行存储过程查找,当我运行我的应用程序时,它会写入数据库,然后出现错误消息。

我不熟悉实体框架工作,只是具有基础知识,我认为这可能是来自model.edmx的映射问题。

在模型中重新创建和映射表和存储过程将是正确的过程?

储存程序。

  1. ALTER PROCEDURE [dbo].[ValuationCreate]
  2. @TrackingNumber varchar(100),@FormMobiValuationId varchar(100),@ValuationPropertyId int,@ValuationFileName varchar(50)
  3.  
  4. AS
  5.  
  6. SET NOCOUNT ON
  7. SET XACT_ABORT ON
  8.  
  9.  
  10. DECLARE @ErrorMessage varchar(1000)
  11.  
  12.  
  13.  
  14. BEGIN TRANSACTION
  15.  
  16.  
  17. --Insert to Valuation
  18. INSERT INTO [Valuation]
  19. (
  20. TrackingNumber,FormMobiValuationId,ValuationPropertyId,-- new
  21. ValuationFileName,Date,ValuationStatus,IsActive
  22. )
  23. VALUES
  24. (
  25. @TrackingNumber,@FormMobiValuationId,@ValuationPropertyId,--new
  26. @ValuationFileName,GETDATE(),1,--Created
  27. 1
  28. )
  29.  
  30.  
  31.  
  32.  
  33.  
  34. IF @@ERROR > 0
  35. BEGIN
  36. SET @ErrorMessage = 'Valuation Insert Failed'
  37. GOTO ErrorHandler
  38. END
  39. ELSE
  40. BEGIN
  41. COMMIT TRANSACTION
  42. RETURN
  43. END
  44.  
  45.  
  46.  
  47. ErrorHandler:
  48.  
  49. RAISERROR(@ErrorMessage,16,1);
  50. ROLLBACK TRANSACTION
  51. RETURN -1

C#调用发生错误错误信息出现在最后一行。

  1. public ObjectResult<Valuation> ValuationCreate(global::System.String trackingNumber,global::System.String formMobiValuationId,Nullable<global::System.Int32> valuationPropertyId,global::System.String valuationFileName)
  2. {
  3. ObjectParameter trackingNumberParameter;
  4. if (trackingNumber != null)
  5. {
  6. trackingNumberParameter = new ObjectParameter("TrackingNumber",trackingNumber);
  7. }
  8. else
  9. {
  10. trackingNumberParameter = new ObjectParameter("TrackingNumber",typeof(global::System.String));
  11. }
  12.  
  13. ObjectParameter formMobiValuationIdParameter;
  14. if (formMobiValuationId != null)
  15. {
  16. formMobiValuationIdParameter = new ObjectParameter("FormMobiValuationId",formMobiValuationId);
  17. }
  18. else
  19. {
  20. formMobiValuationIdParameter = new ObjectParameter("FormMobiValuationId",typeof(global::System.String));
  21. }
  22.  
  23. ObjectParameter valuationPropertyIdParameter;
  24. if (valuationPropertyId.HasValue)
  25. {
  26. valuationPropertyIdParameter = new ObjectParameter("ValuationPropertyId",valuationPropertyId);
  27. }
  28. else
  29. {
  30. valuationPropertyIdParameter = new ObjectParameter("ValuationPropertyId",typeof(global::System.Int32));
  31. }
  32.  
  33. ObjectParameter valuationFileNameParameter;
  34. if (valuationFileName != null)
  35. {
  36. valuationFileNameParameter = new ObjectParameter("ValuationFileName",valuationFileName);
  37. }
  38. else
  39. {
  40. valuationFileNameParameter = new ObjectParameter("ValuationFileName",typeof(global::System.String));
  41. }
  42.  
  43. return base.ExecuteFunction<Valuation>("ValuationCreate",trackingNumberParameter,formMobiValuationIdParameter,valuationPropertyIdParameter,valuationFileNameParameter);
  44. }

解决方法

消息表示存储过程的结果不包含名为ValudationId的列。仔细检查您的选择语句并在SSMS中运行它,以确保您将该列返回。

编辑:您的过程不包含select语句。您需要选择插入的身份值(例如,使用scope_identity()函数),以便EF可将其映射回实体。

例如,

  1. insert into Table
  2. (
  3. Col1,Col2
  4. )
  5. values
  6. (
  7. 1,2
  8. )
  9.  
  10. select scope_identity() as IdentityColName

另外,除此之外,您的insert语句中不需要所有的交易业务;你只有一个声明(你的插入)修改数据。

猜你在找的asp.Net相关文章