加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 00:35:35 所属栏目:asp.Net 来源:网络整理
导读:我正在使用实体框架工作,并更新了一个表及其存储过程,但是当调用存储过程时,我收到以下错误。 The data reader is incompatible with the specified ‘FormValueModel.Valuation’. A member of the type,‘ValuationId’,does not have a corresponding
我正在使用实体框架工作,并更新了一个表及其存储过程,但是当调用存储过程时,我收到以下错误。

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的映射问题。

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

储存程序。

ALTER PROCEDURE [dbo].[ValuationCreate]
    @TrackingNumber varchar(100),@FormMobiValuationId varchar(100),@ValuationPropertyId int,@ValuationFileName varchar(50)

AS   

SET NOCOUNT ON
SET XACT_ABORT ON


DECLARE @ErrorMessage varchar(1000)



BEGIN TRANSACTION


    --Insert to Valuation
    INSERT INTO [Valuation]
    (
        TrackingNumber,FormMobiValuationId,ValuationPropertyId,-- new
        ValuationFileName,Date,ValuationStatus,IsActive
    )
    VALUES
    (
        @TrackingNumber,@FormMobiValuationId,@ValuationPropertyId,--new
        @ValuationFileName,GETDATE(),1,--Created
        1
    )





IF @@ERROR > 0
BEGIN
    SET @ErrorMessage = 'Valuation Insert failed'
    GOTO ErrorHandler
END
ELSE
BEGIN
    COMMIT TRANSACTION
    RETURN
END



ErrorHandler:

RAISERROR(@ErrorMessage,16,1);
ROLLBACK TRANSACTION
RETURN -1

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

public ObjectResult<Valuation> ValuationCreate(global::System.String trackingNumber,global::System.String formMobiValuationId,Nullable<global::System.Int32> valuationPropertyId,global::System.String valuationFileName)
        {
            ObjectParameter trackingNumberParameter;
            if (trackingNumber != null)
            {
                trackingNumberParameter = new ObjectParameter("TrackingNumber",trackingNumber);
            }
            else
            {
                trackingNumberParameter = new ObjectParameter("TrackingNumber",typeof(global::System.String));
            }

            ObjectParameter formMobiValuationIdParameter;
            if (formMobiValuationId != null)
            {
                formMobiValuationIdParameter = new ObjectParameter("FormMobiValuationId",formMobiValuationId);
            }
            else
            {
                formMobiValuationIdParameter = new ObjectParameter("FormMobiValuationId",typeof(global::System.String));
            }

            ObjectParameter valuationPropertyIdParameter;
            if (valuationPropertyId.HasValue)
            {
                valuationPropertyIdParameter = new ObjectParameter("ValuationPropertyId",valuationPropertyId);
            }
            else
            {
                valuationPropertyIdParameter = new ObjectParameter("ValuationPropertyId",typeof(global::System.Int32));
            }

            ObjectParameter valuationFileNameParameter;
            if (valuationFileName != null)
            {
                valuationFileNameParameter = new ObjectParameter("ValuationFileName",valuationFileName);
            }
            else
            {
                valuationFileNameParameter = new ObjectParameter("ValuationFileName",typeof(global::System.String));
            }

            return base.ExecuteFunction<Valuation>("ValuationCreate",trackingNumberParameter,formMobiValuationIdParameter,valuationPropertyIdParameter,valuationFileNameParameter);
        }

解决方法

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

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

例如,

insert into Table
(
    Col1,Col2
)
values
(
    1,2
)

select scope_identity() as IdentityColName

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读