来自EF映射对象的不兼容的数据读取器异常

Pom*_*ter 24 mapping asp.net-mvc entity-framework model

我正在使用实体框架并更新了一个表及其存储过程,但是在调用存储过程时出现以下错误.

数据读取器与指定的"FormValueModel.Valuation"不兼容.类型为"ValuationId"的成员在数据读取器中没有具有相同名称的相应列.

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
Run Code Online (Sandbox Code Playgroud)

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);
        }
Run Code Online (Sandbox Code Playgroud)

Ada*_*son 16

该消息表示存储过程的结果不包含名为的列ValudationId.仔细检查您的select声明并在SSMS中运行它以确保您带回该列.

编辑:您的程序不包含select声明.您需要选择插入的标识值(scope_identity()例如,使用该函数),以便EF可以将其映射回实体.

例如,

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

select scope_identity() as IdentityColName
Run Code Online (Sandbox Code Playgroud)

另外,另外,在insert语句中不需要所有事务业务; 你只有一个声明(你的插入)正在修改数据.


use*_*Bee 12

对于仍然遇到相同错误的用户,请确保指向/连接到正确的数据库.花了好几个小时后,我发现我正在处理活动数据库,而不是测试数据库.当然,我对测试数据库中的存储过程所做的更改在活动数据库中没有等效性.


Ωme*_*Man 9

在我的情况下,它是将数据返回,但列名,没有提供,由于CAST其没有列名别名声明,导致它成为空白.丢失的列名称错误最终导致EF报告的映射失败.

通过在SSMS中进行实际调用并查看结果,实际结果显示了这个现在明显的错误:

在此输入图像描述

将SQL中的列命名为EF预期修复问题的内容.