不兼容的数据读取器异常来自EF映射的对象(Incompatible Data Reader Exce

2019-07-18 00:54发布

我使用实体框架,并已更新的表和它的存储过程,但我得到以下错误,当调用存储过程。

所述数据读取器是与指定的“FormValueModel.Valuation”不相容。 的这种类型的构件,“ValuationId”,不具有在具有相同名称的数据读取器的相应列中。

ValuationId是我想要自动增加我的主键女巫。

我可以执行从SQL Management Studio中存储过程中发现,当我跑我的应用程序写入到数据库中,但随后出现的错误消息。

我不熟悉实体框架,只是有基础知识,我认为这可能是从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);
        }

Answer 1:

该消息意味着,存储过程的结果不包含名为列ValudationId 。 仔细检查您的select语句,并在SSMS中运行它,以确保你带回该列。

编辑:你的程序不包含一个select语句。 您需要选择插入的标识值(使用scope_identity()函数,例如),因此EF可以映射回的实体。

例如,

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

select scope_identity() as IdentityColName

另外,顺便说一句,你并不需要所有的交易业务在INSERT语句中; 你只有一个声明(您的插入)这是修改数据。



Answer 2:

对于那些谁仍然得到同样的错误,请确保您都指向/连接到正确的数据库。 花费数小时后,我发现我的工作在活动数据库上,而不是测试一个。 ,当然这是我的测试数据库的存储过程中所做的更改,并没有对等的活动数据库。



Answer 3:

在我的情况下,它是将数据返回,但列名, 没有规定的 ,由于CAST它没有列名别名声明,导致它成为空白 。 缺少列名错误最终产生由EF报告映射失败。

通过这样做在SSMS的实际通话和查看结果,实际结果表明, 现在这个明显的错误:

命名在SQL列到什么EF预期的固定的问题。



Answer 4:

阿维纳什,对ExecuteSQLCommand良好的通话和“非查询”。 然而,Pornster指的是ExecuteFunction来调用一个SP,并返回结果。 要解决此问题, 从SP中删除“return”语句 ,它会工作。 当您使用return语句,SP将返回一个int,而不是你的选择查询。



Answer 5:

如果插入/删除/更新(这是由EF视为“非查询”),并且可以通过我们的代码中使用被称为

context.Database.ExecuteSqlCommand(insert into Table (Col1,Col2) values (1,2));

但是,如果是做选择查询的原始SQL语句,然后使用

context.DbSet<Table_name>.SqlQuery(select * from table_name).ToList();

或context.Database.SqlQuery(选择从表名*).ToList();

在SqlQuery类()函数,以EF,对于陌生的原因,抛出异常插入/删除/更新操作。 (引发的异常是“类型的成员,不具备具有相同名称的数据读取器的相应列。”)但如果你打开你的SQL Management Studio并检查该项目已实际进行操作。



Answer 6:

奇怪,我通过将解决了这个GO命令的由存储过程的结束。



Answer 7:

我定我的版本这个问题,通过浏览VS模型,寻找下函数导入的存储过程和改变功能为无的返回类型



Answer 8:

其中一个重要的场景将返回不同的条件下不同的结果。 例如,当您使用IF命令可能返回不同的结果,从每个分支设置。 由于EF设置返回集合时进口SP,期望[类型ONE]集合,但得到[2型]集合,然后抛出一个错误没有在数据读取相应的列。 所以,与返回的结果集必须从每一个部分就可以返回同一个集合(如列名和计数)像下面任何SP:

IF (Condition 1)
BEGIN
  SELECT [column1], [column2], [column3], ... FROM [...]
END
ELSE
BEGIN
  SELECT [column1], [column2], [column3], ... FROM [...]
END

这是在同一个问题,我的工作,希望有所帮助。

更新:

还有一次,当我在有错误的返回集合类型我得到这个错误消息Function Imports 。 我真的没想到打字或一些收藏价值,也许只需要一个整数作为输出该参数,但我忘了把Returns a Collection OfNone 。 所以,如果你不期望任何回报的结果去你的模型,并在Model Browser > Function Imports做SP右键点击有问题,然后单击编辑,然后检查Returns a Collection Of部分,并将其设置为None



Answer 9:

在我的情况下,作为布雷特·琼斯认为,解决办法是从我的存储过程中删除“return”语句 ,留下仅简单地“选择”的一部分。 我花了几个小时尝试各种解决方案,我在网上找到的,但它是如此简单。



Answer 10:

也可以不列给别名您使用选择。



Answer 11:

这并不适用于这种特殊情况下,但我也有类似的问题,即同样的错误被抛出,但指定的成员类型是我选择后固定1 ....这是由于我返回相同的列列在两次我的选择....例如: -

SELECT
    CustomerId,
    FirstName,
    LastName,
    CustomerId
FROM
    Customers


Answer 12:

同时还要注意,其中模型的EDMX文件重新映射数据库列名的东西从相应的类对象不同的实例。

在我的情况下,存储过程返航列名称中带有空格[Monthly Bill Rate] 。 为了搞定,列名的模型重新映射。

在某些时候,SP返回列已重命名为[MonthlyBillRate]但没有更新的模式来对应。 当我搜索代码MonthlyBillRate ,有它在Designer.cs文件MonthlyBillRate 。 我不明白为什么我得到的除外。 经仔细检查,我发现在EDMX重新映射的名称。

Model.edmx

重映射发生在ScalarProperty通过标签ColumnName属性。

 <FunctionImportMapping FunctionImportName="BillingReport" FunctionName="Model.Store.BillingReport">
  <ResultMapping>
    <ComplexTypeMapping TypeName="Model.BillData">
      <ScalarProperty Name="MonthlyBillRate" ColumnName="Monthly Bill Rate" />
    </ComplexTypeMapping>
  </ResultMapping>

Model.Designer.cs

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
    [DataMemberAttribute()]
    public Nullable<global::System.Decimal> MonthlyBillRate
    {
      ... etc ...
    }


文章来源: Incompatible Data Reader Exception From EF Mapped Objects