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

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

储存程序。

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语句中不需要所有的交易业务;你只有一个声明(你的插入)修改数据。

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